我想生成一个随机矩阵,其行总和为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;
我不知道为什么?
答案 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
不同)