Сравнение двух матриц в Matlab - PullRequest
14 голосов
/ 02 июня 2009

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

Ответы [ 6 ]

13 голосов
/ 02 июня 2009

Попробуйте это:

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

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

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

all(tf(:))
5 голосов
/ 02 июня 2009

Изменение Решение Эдрика :

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 будет иметь значение false, если либо абсолютная или относительная погрешность любого элемента больше, чем любые допуски, которые вы выбираете. Кроме того, если какие-либо элементы x окажутся точно равными 0, то некоторые элементы relError могут оказаться либо бесконечными, либо не числовыми, поэтому я использовал ISFINITE функция игнорировать эти значения, устанавливая их в 0.

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

4 голосов
/ 02 июня 2009

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

function same = tol( x, y )
absTol = 1e-3;
relTol = 0.05;
errVec = abs( x(:) - y(:) );
same = all( (errVec < absTol) | (errVec./x(:) < relTol) );
1 голос
/ 09 октября 2010

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

relError(x < absTol) = 0;

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

0 голосов
/ 11 августа 2016

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

tol = 0.05;

result = abs(x - y) <= tol;
0 голосов
/ 21 февраля 2012

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

...