2010-02-04 11 views
16

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

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

+2

Всегда, всегда векторизовать код MATLAB, если это возможно. – Doresoom

+0

Должно быть перемещено на http://math.stackexchange.com/? – aaronsnoswell

ответ

12

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

index = A == B; 

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

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

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

Дополнительную информацию о работе с «опасностями операций с плавающей запятой» можно найти на странице this question's answers. Одним из решений было бы проверить, что массив элементов находятся в пределах заданного допуска друг от друга, например, так:

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

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

+0

Matlab имеет функцию eps, описываемую как относительная точность с плавающей точкой.Вы можете использовать его вместо переменной допуска в коде gnovice. index = abs (A-B) <= eps; – yuk

+0

eps - это наименьшее значение, которое может быть представлено, не так ли? Это не очень полезно в этом контексте. –

7

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

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

ans = 

    1  0 
    0  1 
29

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

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

Абсолютное сравнение толерантность 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) 
+0

Что случилось с 'isequal'? – Jacob

+4

try: 'isequal (0.3.0.1 * 3)', что эквивалентно '0.3 == 0.1 * 3'. Ответ в обоих ложных! – Amro

+1

Мои извинения - я полагаю, моя вера в MATLAB была неуместной! Теперь мне придется изменить код :( – Jacob

Смежные вопросы