我在MATLAB中读到了关于正确使用内存的有趣文章。这里是:官方网站链接,这里我看到了一个例子:
如果数据包含许多零,请考虑使用稀疏数组,该数组只存储非零元素。下面的示例比较存储主要为零的数组所需的空间:
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由一个元素组成,它实际上不会创建对角线矩阵!帮助是错误的吗?但。还有一个问题:它为什么会这样工作?
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我希望得到5值为(1,1)或(5,5)的矩阵5x5。为什么它创建6x6矩阵和为什么5是一个(1,6)元素?
不久前,他们修复了文档:

发布于 2015-11-25 14:35:43
手册:诊断您正在使用第二个重载版本的diag:
D= diag(v,k)将向量v的元素放置在kth对角线上。k=0代表主对角线,k>0在主对角线之上,k<0在主对角线之下。
因此,您的命令A= diag( 5 ,5)将构造一个矩阵,其中主对角线上方的对角元素将等于矢量5,因此得到的值只有A(1,6)有一个值。
如果您想要一个1e3x1e3矩阵和对角线上的矩阵,请尝试
A = diag(ones(1,1e3));发布于 2015-11-25 14:43:47
这篇文章不正确。
A = diag(1e3,1e3);在对角线上不产生矩阵。该守则应改为:
A = eye(1e3,1e3);发布于 2015-11-25 14:34:36
现在再读一遍你的问题,我真的明白了,必须重写我的答案。您正在引用文档的这一部分:
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
https://stackoverflow.com/questions/33919076
复制相似问题