У меня есть два больших массива приблизительно с 1 000 строк и 1 000 столбцов. Я должен сравнить каждый элемент этих массивов и сохранить 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)
Если две ваши матрицы A
и B
имеют одинаковый размер, то вы можете сделать это:
index = A == B;
и index
будет логическим массивом с единицами везде, где элементы A
и B
равны и равны нулю в противном случае.
Предупреждение ...
Если A
и B
содержат целые числа, вышеуказанное должно быть приемлемым. Однако, если они содержат значения с плавающей запятой, вы можете получить нежелательные результаты. В приведенном выше коде будет только одно значение для элементов, которые точно равны. Даже самая маленькая разница приведет к тому, что элементы будут считаться неравными.
Вы можете посмотреть ответы на этот вопрос для получения дополнительной информации о том, как бороться с «опасностями операций с плавающей запятой». Одним из решений может быть проверка того, что элементы массива находятся в пределах заданного допуска друг к другу, например:
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
Вышеупомянутое даст вам логический массив index
с единицами везде, где элементы A
и B
находятся в пределах 0,0001 друг от друга и равны нулю в противном случае.
Просто используйте обычный оператор ==
:
>> [1 2; 3 4] == [1 5; 6 4]
ans =
1 0
0 1