Как сравнить все элементы двух массивов? - PullRequest
16 голосов
/ 04 февраля 2010

У меня есть два больших массива с около 1000 строк и 1000 столбцов. Мне нужно сравнить каждый элемент этих массивов и сохранить 1 в другом массиве, если соответствующие элементы равны.

Я могу сделать это с помощью циклов for, но это занимает много времени. Как я могу сделать это быстрее?

Ответы [ 3 ]

29 голосов
/ 05 февраля 2010

Все ответы даны правильно. Я просто хотел уточнить замечание gnovice о тестировании с плавающей точкой.

При сравнении чисел с плавающей точкой на равенство необходимо использовать значение допуска. Обычно используются два типа сравнений толерантности: абсолютная и относительная. ( источник )

Сравнение абсолютных допусков a и b выглядит следующим образом:

|a-b| < tol

Сравнение относительных допусков выглядит так:

|a-b| < tol*max(|a|,|b|) + tol_floor

Вы можете реализовать две вышеупомянутые функции как анонимные:

%# absolute tolerance equality
isequalAbs = @(x,y,tol) ( abs(x-y) <= tol );

%# relative tolerance equality
isequalRel = @(x,y,tol) ( abs(x-y) <= ( tol*max(abs(x),abs(y)) + eps) );

Тогда вы можете использовать их как:

%# let x and y be scalars/vectors/matrices of same size
x == y
isequalAbs(x, y, 1e-6)
isequalRel(x, y, 1e-6)
12 голосов
/ 04 февраля 2010

Если ваши две матрицы A и B имеют одинаковый размер, то вы можете сделать это:

index = A == B;

и index будут логическим массивом с единицами везде, где элементы A и B равны и равны нулю.

Слово предупреждения ...

Если A и B содержат целые числа, вышеприведенное должно быть в порядке. Однако, если они содержат значения с плавающей запятой, вы можете получить нежелательные результаты. Приведенный выше код будет иметь значения только для элементов, которые точно равны. Даже самая маленькая разница приведет к тому, что элементы будут считаться неравными.

Вы можете посмотреть ответы на этот вопрос для получения дополнительной информации о работе с "опасностями операций с плавающей запятой". Одним из решений было бы проверить, что элементы массива находятся в пределах заданного допуска друг к другу, например:

tolerance = 0.0001;
index = abs(A-B) <= tolerance;

Выше приведен логический массив index, в котором элементы A и B находятся в пределах 0,0001 друг от друга, а в противном случае равны нулю.

7 голосов
/ 04 февраля 2010

Просто используйте обычный оператор ==:

>> [1 2; 3 4] == [1 5; 6 4]      

ans =

     1     0
     0     1
...