2015-07-01 2 views
3

Следующий скрипт должен распечатать матрицу 7x7 all-ones, потому что уравнение выполнено.Matlab матрица-умножение и точность транспонирования

A = rand(5,7); 
B = rand(5,7); 

C = (A' * B)'; 
D = B' * A; 

C == D 

Вместо этого вида ответа:

ans = 

1  1  1  1  0  1  1 
1  1  1  1  0  1  0 
1  1  1  1  1  1  1 
1  1  1  1  0  0  0 
1  0  1  1  1  1  1 
0  0  1  1  1  1  1 
0  1  1  0  1  1  1 

Я думаю, что это проблема точности с плавающей точкой, потому что с format long номера отличаются C и D.

  • Что я делаю неправильно?
  • Куда он пойдет не так?
  • Как этого избежать?
+3

* Я думаю, что это проблема точности с плавающей точкой [...] *. Да. Поскольку 'rand' возвращает числа с плавающей запятой, вы не должны ожидать, что матрицы' C' и 'D' будут в точности равны. Предпочитайте что-то вроде 'norm (C-D) <= epsilon', где' epsilon' - небольшое положительное число. – Jubobs

ответ

3

Вы не делаете ничего плохого - компьютер имеет конечную точность, и ваш расчет показывает его - точно так же, как 1e6 + 0.1 - 1e6 (попробуйте в Matlab). Один из способов избежать этого - использовать некоторую библиотеку для произвольной точности - но она не «решит» ее, а просто поставит проблему на меньшие и меньшие числа.

Смотрите эти ссылки для некоторых больше информации:

http://floating-point-gui.de/errors/comparison/

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Кстати, format long не имеет ничего общего с реальной точностью, он просто задает путь числа отформатированы для .

Смежные вопросы