Сравнение двух матриц в 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 верно