ismember для строковых элементов матрицы в MATLAB - PullRequest
1 голос
/ 19 мая 2011

проверяет член для элементов массива или матрицы. Как мы проверяем строково-числовые элементы вместе? Пожалуйста, смотрите ниже:

cell1 = {'netincome' [1] ; 'equity' [2] }  ;

cell2 = { 'cogs' [2222] [1] ; 'equity' [3501] [2] ; 

          'equity' [3333] [1] ; 'netincome' [1751] [1] } ;

Это не удалось -> ismember (cell1 (:, [1 2]), cell2 (:, [1 3])% Я знаю, почему это не удается.

Есть ли способ сопоставления строковых и числовых элементов из 2 ячеек? Я попытался использовать ismember независимо (использовался cell2mat func), но все равно не смог найти правильный ответ. Желаемый ответ:

[1751 ; 3501] ; OR 'netincome' [1751] [1] ; 'equity' [3501] [2] 

1 Ответ

1 голос
/ 20 мая 2011

Я не думаю, что есть хорошее встроенное решение для этой ситуации.Лучшее, что я могу придумать на данный момент, - это создать два вложенных цикла для сравнения всех строк каждого массива ячеек, используя функцию ISEQUAL для сравнения:

index = zeros(size(cell1,1),1);
for row1 = 1:size(cell1,1)
  for row2 = 1:size(cell2,1)
    if isequal(cell1(row1,:),cell2(row2,[1 3]))
      index(row1) = row2;
      break
    end
  end
end

Результатом будет набор индексов совпадений в векторе N-by-1 index, где N - количество строк в cell1.Если строка cell1 не может быть сопоставлена ​​с данными в любой строке cell2, то соответствующая запись index будет равна 0. Индексы совпадений в index сохранят исходный порядок данныхв cell1.Кроме того, этот код игнорирует несколько совпадений в cell2, возвращая только индекс первого найденного совпадения и прерывая внутренний цикл (что потенциально сократит количество необходимых итераций).

Теперь вы можете индексировать в cell2 для получения данных, соответствующих содержанию cell1:

>> cell2(index,:)

ans = 

    'netincome'    [1751]    [1]
    'equity'       [3501]    [2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...