#matlab
#matlab — математическая лаборатория #matlab
Вопрос:
ismember проверяет наличие элементов массива ячеек или матрицы. Как мы проверяем наличие элементов строковой матрицы вместе? Пожалуйста, смотрите ниже:
cell1 = {'netincome' [1] ; 'equity' [2] } ;
cell2 = { 'cogs' [2222] [1] ; 'equity' [3501] [2] ;
'equity' [3333] [1] ; 'netincome' [1751] [1] } ;
Это не удается -> ismember(cell1(:,[1 2]), cell2(:,[13]) % Я знаю, почему это не удается.
Есть ли какой-либо способ сопоставить строковые элементы и числовые элементы из 2 ячеек? Я пытался использовать ismember независимо (использовалась функция cell2mat), но все еще не могу найти правильный ответ. Желаемый ответ:
[1751 ; 3501] ; OR 'netincome' [1751] [1] ; 'equity' [3501] [2]
Комментарии:
1. Пара вопросов: Являются ли записи в
cell1
иcell2
уникальными (т.е. без повторов)?cell1
Гарантировано ли совпадение записей вcell2
?2. Ans1.
cell1
записи уникальны, если рассматривать col1 и col2 вместе.cell2
записи не уникальны для col1 и col3. Некоторые строки могут повторяться Ans2. Да, всегда!
Ответ №1:
Я не думаю, что есть какое-либо хорошее встроенное решение для этой ситуации. Лучшее, что я могу придумать на данный момент, это создать два вложенных цикла для сравнения всех строк каждого массива ячеек, используя функцию 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 на 1 index
, где N — количество строк в cell1
. Если строка из cell1
не может быть сопоставлена с данными ни в одной строке из cell2
, то соответствующая запись из index
будет равна 0. Индексы совпадений в index
сохранят исходный порядок данных в cell1
. Кроме того, этот код игнорирует несколько совпадений в cell2
, возвращая только индекс первого найденного совпадения и прерывая внутренний цикл (что потенциально уменьшит количество необходимых итераций).
Теперь вы можете проиндексировать в cell2
, чтобы получить данные, соответствующие тому, что находится в cell1
:
>> cell2(index,:)
ans =
'netincome' [1751] [1]
'equity' [3501] [2]
Комментарии:
1. Спасибо gnovice. Важно, чтобы я поддерживал порядок! Можете ли вы предложить изменения? Был бы признателен.
2. @Maddy: Я обновил свой ответ, чтобы сохранить порядок.
3. Привет .. пожалуйста, посмотрите мой ответ на ваш 1Q. Я пытаюсь посмотреть, можно ли обработать / удалить повторения в ячейке2. Дайте мне знать, если у вас есть какие-либо комментарии. Спасибо.
4. Один из подходов заключается в запуске cell2 с помощью mathworks.com/matlabcentral/fileexchange /… а затем введите этот результат в свой код.
5. @Maddy: Если в
cell2
, например{'equity' 3501 2}
, есть повторяющиеся строки, появляющиеся несколько раз, и вам нужно сопоставить только 1 из них, то приведенный выше код будет нормально работать как есть. Если у вас есть строки типа{'equity' 3501 2}
и{'equity' 3333 2}
, где повторяется все, кроме второго столбца, вам нужно принять некоторые решения. Если вам по-прежнему нужно сопоставить только один, и вам либо все равно, какой из них, либо вы хотите использовать первый, то приведенный выше код все равно будет нормально работать как есть. Если вам нужно сопоставить все вхождения или сопоставить на основе условия, в коде потребуется несколько небольших изменений.