Подтвердить что ты не робот

Как сравнить все элементы двух массивов?

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

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

4b9b3361

Ответ 1

Все приведенные ответы правильны. Я просто хотел подробнее остановиться на замечании 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)

Ответ 2

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

index = A == B;

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

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

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

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

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

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

Ответ 3

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

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

ans =

     1     0
     0     1