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

У меня есть один массив строк, который я хочу использовать для извлечения образцов из большей матрицы данных, которые у меня есть. Прямо сейчас у меня есть один массив строк, 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)

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


person user2180513    schedule 17.03.2013    source источник


Ответы (1)


Первое, что нужно отметить, это то, что ваш цикл по 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
person Glen O    schedule 18.03.2013
comment
Спасибо. Итак, вы имеете в виду, что перечислив только A (i1) = number (strcmp (C (i1), data)); Matlab сравнит строки в моем массиве «C» со строками в новом массиве «data», который должен содержать как строки, так и числа, а затем, когда он найдет совпадение, выведет числа в A? Чтобы я мог упростить все, что у меня было, до этого? - person user2180513; 18.03.2013
comment
О, там была небольшая опечатка - я сказал данные, когда имел в виду имена. Это будет исправлено через мгновение. strcmp может сравнивать строку с массивом ячеек строк, и на выходе получается логический массив, указывающий, какие записи совпадают. Пока записи имен (которые должны быть строковой частью данных) уникальны, вы получите один результат от чисел (strcmp) для каждой записи в C. Я не уверен, как это будет взаимодействовать с пересечением , хотя. - person Glen O; 18.03.2013
comment
Спасибо!! Думаю, я понял. - person user2180513; 18.03.2013
comment
@GlenO Я считаю, что вместо цикла вы также можете использовать второй выходной аргумент ismember(C, names). Возможно, это еще больше ускорит процесс. - person Eitan T; 18.03.2013
comment
Может быть. У меня нет опыта работы с ismember, кроме тестирования существующего кода здесь, в stackoverflow. Возможно, вы могли бы создать соответствующее решение. Поскольку я использую Octave, я все равно не могу сравнивать скорость для Matlab, поэтому я не могу проверить, какой метод быстрее. - person Glen O; 18.03.2013
comment
@GlenO ismember также доступен в Octave. - person Eitan T; 18.03.2013
comment
Да, но Octave и Matlab отличаются по скорости. Тест скорости в Octave не имеет смысла для Matlab. - person Glen O; 19.03.2013