Как сравнить все элементы двух массивов?
У меня есть два больших массива с примерно 1000 строк и 1000 столбцов. Мне нужно сравнить каждый элемент этих массивов и сохранить 1 в другом массиве, если соответствующие элементы равны.
Я могу сделать это с помощью циклов, но это занимает много времени. Как я могу сделать это быстрее?
Ответы
Ответ 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