我在MATLAB上阅读了有关正确内存使用的有趣文章。这是:Link at official website 在这里我看到了例子:
如果您的数据包含许多零,请考虑使用稀疏数组 仅存储非零元素。以下示例比较空间 存储主要为零的数组所需:
A = diag(1e3,1e3); % Full matrix with ones on the diagonal
As = sparse(A) % Sparse matrix with only nonzero elements
我尝试在我的代码中实现它并找到有趣的时刻:
A = diag(1e3,1e3)
不会在对角线上创建矩阵!它创建零矩阵,只有一个非零元素:
clear A
A = diag(1e3,1e3);
find(A);
ans =
1001001
A(1001001)
ans =
1000
确定。我在帮助中阅读了diag
函数,并看到了这一点:
D = diag(v)返回一个方形对角矩阵,其元素为 矢量v在主对角线上。
确定!因此,如果v
由1个元素组成,它实际上不会创建对角矩阵!这是错误的帮助吗?
但。还有一个问题:为什么它会这样运作?
diag(5,5)
ans =
0 0 0 0 0 5
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
我希望在(1,1)或(5,5)处获得5
值的矩阵5x5。为什么它会创建6x6矩阵,为什么5
是(1,6)元素?
答案 0 :(得分:3)
手动:diag 你正在使用第二个重载版本的diag:
D = diag(v,k)将向量v的元素放在第k个对角线上。 k = 0表示主对角线,k> 0在主对角线之上,并且k <0在主对角线之下。
所以你的命令A = diag(5,5)将构造一个矩阵,其中主对角线上方第5对角线的对角元素将等于向量[5]。因此,只有A(1,6)具有值的结果值。
如果你想要一个1e3x1e3矩阵与对角线上的那个矩阵尝试
A = diag(ones(1,1e3));
答案 1 :(得分:2)
文章不正确。
A = diag(1e3,1e3);
不会产生对角线上的矩阵。代码应改为:
A = eye(1e3,1e3);
答案 2 :(得分:1)
现在再次阅读你的问题,我真的理解它并且必须改写我的答案。您正在参考文档的这一部分:
A = diag(1e3,1e3); % Full matrix with ones on the diagonal
As = sparse(A) % Sparse matrix with only nonzero elements
whos
Name Size Bytes Class
A 1001x1001 8016008 double array
As 1001x1001 4020 double array (sparse)
这个例子肯定是错的,可能应该是:
A=eye(1e3,1e3)
As=sparse(A);
在主对角线上创建1000x1000矩阵。
将错误报告给mathworks