Октава — сравнение неравных матриц и нахождение равных элементов

#matrix #compare #octave

#матрица #Сравнить #октава

Вопрос:

У меня есть две матрицы разных размеров, и я хочу сравнить, совпадает ли какой-либо из элементов в их первых столбцах (и в конечном итоге удалить строки, где есть совпадение). Цикл занимает слишком много времени, поэтому я пробую векторизованную версию, но ничего из того, что я пробовал, не сработало. Любая помощь будет высоко оценена!

Ответ №1:

Пример.

 A    = magic(3);
B    = magic(6);

UpTo       = min( size( A, 1 ), size( B, 1 ) );
CommonRows = B(1 : UpTo, 1) == A(1 : UpTo, 1);

B( CommonRows, : ) = []   % B with rows of same element in column 1 removed
  

Комментарии:

1. Почти, но не совсем… Работает только для одинаковых измерений и для отсортированных индексов в порядке возрастания. Возвращает B с удалением только одной строки, если совпадение было найдено в первых 3 строках, как и размерность A.

2. @Tijana Да! Это то, что вы просили. 🙂 Конечно, то, что вы спросили, можно интерпретировать по-разному, я просто выбрал тот, который, как я думал, вы, вероятно, имели в виду. Вы хотели бы сделать свой вопрос более конкретным? Возможно, добавьте пример входных данных и того, что вы ожидаете (и чего вы ожидаете, что ЭТОГО НЕ произойдет)?

3. Например, ожидается, что элементы в первом столбце будут уникальными? Или вы полагаетесь на то, что их положение одинаково?

4. Вы правы, я недостаточно ясно выразился. Я хочу сравнить значения элементов в первом столбце двух матриц разного размера, чтобы проверить, есть ли перекрытие с некоторыми элементами, и если элемент присутствует в 1-м столбце обеих матриц, тогда я удаляю строку с этим элементом из первой матрицы. Кстати, элементы в 1-м столбце сортируются в порядке возрастания. Я мог бы выделить этот столбец и использовать команду intersect with index и перебирать эти индексы, но мне интересно, есть ли более простой способ.

5. Что-то вроде setdiff(A(:,1),B(:,1)), но это возвращает целые строки, а не только уникальные элементы.

Ответ №2:

Это последнее, что я пробовал и почти получил, но не работает, когда у меня повторяющиеся значения в обеих матрицах.

  [C,iC]=setdiff(A(:,1),B(:,1))
 [D,iD]=intersect(A(:,1),B(:,1))

 newA=A(iC,:)
 newBtemp=[A(iD,:);B]
 newB=sort(newBtemp)
  

Но я думаю, что теперь я понял это окончательно:

 common=ismember(A(:,1),B(:,1))
temp=A(common,:)
A(common,:)=[]
newB=sort([temp;B])