【问题标题】:MATLAB manual error?MATLAB手动错误?
【发布时间】:2016-02-28 09:28:15
【问题描述】:

我阅读了有关在 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

我希望得到矩阵 5x5,5 值为 (1,1) 或 (5,5)。为什么它会创建 6x6 矩阵以及为什么 5 是 (1,6) 元素?


前段时间他们修复了文档:

【问题讨论】:

    标签: matlab matrix


    【解决方案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

    【讨论】:

      【解决方案2】:

      手册:diag 您正在使用 diag 的第二个重载版本:

      D = diag(v,k) 将向量 v 的元素放在第 k 个对角线上。 k=0代表主对角线,k>0在主对角线上方,k

      因此,您的命令 A = diag(5,5) 将构造一个矩阵,其中主对角线上方的第 5 条对角线的对角线元素将等于向量 [5]。因此只有 A(1,6) 有值的结果值。

      如果你想要一个 1e3x1e3 矩阵,在对角线上试试

      A = diag(ones(1,1e3));
      

      【讨论】:

      • 当然!愚蠢的错误!但是帮助呢?真的错了吗?
      • 哪里会出错?它与那里描述的完全一样。不过,我的回答中有错字,应该是 A(1,6) 而不是 A(1,5)。这是因为主对角线计为 0。所以上面的第 5 个对角线从索引 A(1,6) 开始
      • 是的,我明白了。但是看看这个:A = diag(1e3,1e3); % Full matrix with ones on the diagonal。它在对角线上没有。
      • @Mikhail_Sam 没错! diageye 是两个不同的东西。 A= diag(1e3,1e3) 会将值 1e3 放在从主对角线到顶部的 1e3 对角线上。如果这显示在您的帮助中确实是错误的,但我无法在在线文档中阅读。
      【解决方案3】:

      文章不正确。

      A = diag(1e3,1e3);
      

      不会生成对角线上的矩阵。代码应改为:

      A = eye(1e3,1e3);
      

      【讨论】:

      • 谢谢!你现在能给我建议吗:我想接受答案,但一半是你的答案,一半是@FirefoxMetzger 的答案:) 我必须选择哪一个?
      猜你喜欢
      • 2020-08-31
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2014-02-22
      • 2015-05-09
      相关资源
      最近更新 更多