Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Matlab: как сравнить два массива строк, а затем выбрать числовые значения, связанные с этими строками?

Автор вопроса: user2180513Ответов: 1

У меня есть один массив строк, который я хочу использовать для извлечения образцов из большей матрицы данных, которые у меня есть. Прямо сейчас у меня есть один массив строк, 1200x1. И мои фактические данные "имена" (массив строк, который обозначает, что значения соответствуют 6855x1, а "данные" - 6855x2.

Вот что я придумал:

C = intersect(names,sites) %To find common strings

% Чтобы найти, где эти строки находятся в моем исходном наборе данных:

Q=zeros(length(C),1)
for i=1:length(C)
    for j=1
   while strcmp(C(i),names(j))==0
       j=j+1
       Q(i)=j
   end
    end
end

% Чтобы затем использовать приведенные выше значения для компиляции нового вектора с фактическими значениями данных из "данных":

A=zeros(length(Q),1)
for i=1:length(Q)
A(i) = mock(Q(i),1)

Единственная проблема в том, что я запускаю второй набор циклов, который я перечислил прямо сейчас, и очевидно, что это займет несколько часов. Я думаю, что должен быть более быстрый способ без создания трех циклов. Кто-нибудь знает лучший метод?

stringmatlabcompare

Ответы

Ответ 1 · Glen O

Первое, что нужно отметить, это то, что ваш цикл по Q может быть тривиально ускорен, как:

A = mock(Q,1);

хотя я подозреваю, что вы имели в виду данные (Q, 2).

Если вы храните свой список имен в массиве ячеек, а не в обычном массиве, вы сможете еще больше ускорить процесс. Предположим, что данные представляют собой массив ячеек, имена {1:6855} и номера списка значений (1:6855).

A = zeros(length(C),1);
for i1=1:length(C)
    A(i1)=numbers(strcmp(C(i1),names));
end

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы