【问题标题】:Create a matrix with ones on any offset diagonal [duplicate]在任何偏移对角线上创建一个矩阵[重复]
【发布时间】:2019-02-11 11:30:12
【问题描述】:

我的目标是创建一个在偏移对角线上创建矩阵的函数:

eye(5) 函数非常相似,但现在在偏移对角线上。最好不要使用双 for 循环。我不想要完整的矩阵,而是必须将它们插入现有的矩阵中。我怎样才能做到这一点?

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    diag 内置了这个功能:

    diag(ones(4,1),1)
    ans =
    
         0     1     0     0     0
         0     0     1     0     0
         0     0     0     1     0
         0     0     0     0     1
         0     0     0     0     0
    
    diag(ones(4,1),-1)
    
    ans =
    
         0     0     0     0     0
         1     0     0     0     0
         0     1     0     0     0
         0     0     1     0     0
         0     0     0     1     0
    

    diag(V,k) 的语法是:V 是要放在对角线上的向量(无论是一个向量还是任何奇数向量),k 是对角线的标签。 0 是主对角线,正整数越远离上对角线,负整数越远离下对角线;即k=1 给出第一个上对角线,k=-4 在这个例子中给出左下角。

    为了完整起见,如果您只想要索引而不是完整矩阵(因为您建议要将向量插入到当前矩阵中),您可以使用以下函数:

    function [idx] = diagidx(n,k)
    % n size of square matrix
    % k number of diagonal
    if k==0 % identity
        idx = [(1:n).' (1:n).']; % [row col]
    elseif k>0 % Upper diagonal
        idx = [(1:n-k).' (1+k:n).'];
    elseif k<0 % lower diagonal
        idx = [(1+abs(k):n).' (1:n-abs(k)).'];
    end
    end
    

    idx 的每一行都包含矩阵的索引。

    【讨论】:

      【解决方案2】:
      triu(B+1,1)-triu(B+1,2)
      

      在第一个上非对角线上创建一个,并且

      tril(B+1,-2)-tril(B+1,-3)
      

      对第一个较低的非对角线也是如此。

      【讨论】:

      • 当你的矩阵是例如1000x1000,您创建 999+998+...+1 个,然后从中减去 998+997+...+1 个。它有效,但我怀疑这会比 JIT 优化的循环更快,因为你执行了大量的减法。
      • 我应该更具体地回答我的问题。我必须将它们插入现有矩阵。但我想我可以在 diag 中使用 offset 参数来减小它生成的矩阵大小。然后将其添加到现有矩阵中
      • 即使将它们插入到现有矩阵中,您仍然可以使用diagtriu 创建掩码,对吗?在这种情况下,我会选择diag(ones()) 选项,将其设为逻辑掩码(或使用subs2ind),然后将向量索引到矩阵中。
      猜你喜欢
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多