Сравнение двух матриц в Matlab

У меня есть две матрицы x и y, оба являются результатами из разных алгоритмов/подпрограмм, которые должны вычислять один и тот же результат. Хотя я знаю, что isequal() будет проверять, являются ли x и y одной и той же матрицей, записи в этих матрицах не будут точно такими же (например, некоторые записи могут быть с 5% в худшем случае). В этом сценарии, какой будет лучший метод их сравнения, чтобы убедиться, что они достаточно близки, чтобы считаться одним и тем же результатом? Заранее благодарим за советы.

Ответы

Ответ 1

Изменение решения Edric:

absTol = 1e-3;   % You choose this value to be what you want!
relTol = 0.05;   % This one too!
absError = x(:)-y(:);
relError = absError./x(:);
relError(~isfinite(relError)) = 0;   % Sets Inf and NaN to 0
same = all( (abs(absError) < absTol) & (abs(relError) < relTol) );

Переменная same будет ложной, если абсолютная или относительная ошибка любого элемента больше, чем любые допуски, которые вы выберете. Кроме того, если любые элементы x оказываются точно равными 0, то некоторые из элементов relError могут быть либо бесконечными, либо не-a-number, поэтому я использовал ISFINITE, чтобы игнорировать эти значения, установив их в 0.

Я бы не предложил использовать IMAGESC для сравнения графиков, так как 1) данные масштабируются, когда они отображаются, 2) в цветовой палитре для дисплея есть дискретное количество значений цвета (по-моему, по умолчанию 256, следовательно, много округления), и 3) тонкие вариации цвета могут быть не такими очевидными из визуального сравнения двух графиков.

Ответ 2

Попробуйте следующее:

tf = abs((A-B)./B)<0.05

Это вернет логическую матрицу, которая будет истинна для каждого элемента, если относительная разница между A и B по отношению к B меньше 5 процентов.

Если вы хотите спросить, все ли они истинны (все они удовлетворяют вышеуказанному условию):

all(tf(:))

Ответ 3

Я бы подумал о том, чтобы сделать что-то подобное с абсолютным допуском, а также относительным допуском:

function same = tol( x, y )
absTol = 1e-3;
relTol = 0.05;
errVec = abs( x(:) - y(:) );
same = all( (errVec < absTol) | (errVec./x(:) < relTol) );

Ответ 4

Когда у вас есть очень маленькие пары значений в x и y, результат будет возвращать 0, хотя значения сами не знают. Итак, дополнение к принятому решению

relError(x < absTol) = 0;

может использоваться для удаления очень маленьких ошибок. Таким образом, относительная ошибка не учитывается для этих значений.

Ответ 5

Для матриц x и y, содержащих значения с плавающей запятой, вы можете проверить, находятся ли элементы массива в пределах данного допуска друг к другу. Пример кода:

tol = 0.05;

result = abs(x - y) <= tol;

Ответ 6

использовать 'isequal (a, b), где a и b - две матрицы, если 1 верно