为什么这个事情发生在随机矩阵中,所有行总和为1?

时间:2014-06-24 18:33:15

标签: matlab precision

我想生成一个随机矩阵,其行总和为1。我找到了这个问题并回答How to create a random matrix such that all rows sum to 1,这些都是我想要的。

问题是当我这样做时,有时总和不是一个。

mat      = rand(2, 2);
rowsum   = sum(mat, 2);
mat      = bsxfun(@rdivide, mat, rowsum);

有时我得到这样的东西:

sum_test = sum(mat, 2)-1
1.0e-15 *
      0
-0.2220;

我不知道为什么?

1 个答案:

答案 0 :(得分:2)

Matlab使用双精度数字,这意味着只能表示一组有限的数字。可以使用eps函数在Matlab中找到双精度数之间的差距。对于值1,这几乎是您对每行eps(1) = 2.220446049250313e-16求和时得到的值,这是您获得的相同幅度数值误差。在矩阵中划分每个值时会引入错误。有关Matlab precision here的更多信息。

即使从每行中的第一个值中减去错误,也不能完全解决问题(虽然它确实有帮助)。例如,

mat = rand(10,10);
rowsum = sum(mat,2);
mat = bsxfun(@rdivide,mat,rowsum);
sum_test = sum(mat,2)-1    %finite error
mat(:,1) = mat(:,1) - sum_test; %subtract the error from the first column in each row
sum_test2 = sum(mat,2)-1   %still get error

结果

sum_test = [
-1.110223024625157e-16
                     0
                     0
                     0
                     0
-2.220446049250313e-16
                     0
-2.220446049250313e-16
-1.110223024625157e-16
-2.220446049250313e-16]

sum_test2 = [
 2.220446049250313e-16
                     0
                     0
                     0
                     0
                     0
                     0
                     0
-1.110223024625157e-16
                     0]

(您可以证明即使(sum(mat,2)-0.5)-0.5提供的答案与sum(mat,2)-1不同)