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

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

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

16
задан Andrey Rubshtein 25 January 2012 в 19:50
поделиться

3 ответа

Все ответы верны. Я просто хотел уточнить замечание 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)
29
ответ дан 30 November 2019 в 15:47
поделиться

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

index = A == B;

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

Предупреждение ...

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

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

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

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

12
ответ дан 30 November 2019 в 15:47
поделиться

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

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

ans =

     1     0
     0     1
7
ответ дан 30 November 2019 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: