【问题标题】:Matlab identity shift matrixMatlab单位移位矩阵
【发布时间】:2015-07-25 16:21:44
【问题描述】:

是否有任何内联命令可以在 MATLAB 中生成移位单位矩阵?

A=[ ...
0, 1, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 1, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 1, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 1, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 1, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 1, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 1, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 1, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 1
0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

circshifteye 的组合很好,但是它需要另一个命令来修复它。有更简单的方法吗? (只需一种简单的语法)

【问题讨论】:

    标签: matlab matrix binary


    【解决方案1】:

    尝试将diag 调用与ones 结合使用。对于您的情况,您有一个 10 x 10 单位矩阵,并且想要将对角线向右移动 1。

    >> n = 10;
    >> shift = 1;
    >> A = diag(ones(n-abs(shift),1),shift)
    
    A = 
    
       0     1     0     0     0     0     0     0     0     0
       0     0     1     0     0     0     0     0     0     0
       0     0     0     1     0     0     0     0     0     0
       0     0     0     0     1     0     0     0     0     0
       0     0     0     0     0     1     0     0     0     0
       0     0     0     0     0     0     1     0     0     0
       0     0     0     0     0     0     0     1     0     0
       0     0     0     0     0     0     0     0     1     0
       0     0     0     0     0     0     0     0     0     1
       0     0     0     0     0     0     0     0     0     0
    

    上面的代码首先声明了一个全为 1 的列向量,但我们需要其中的n-abs(shift),因为向右移动意味着我们需要更少的 1 来填充(稍后会详细介绍)。 n-abs(shift) 也对应于矩阵的总行数/列数,并减去您向右移动的次数。接下来,您可以使用diag,其中第一个参数是一个列向量,它创建一个 zero 矩阵并将列向量作为系数沿该矩阵的对角线放置。第二个参数(在您的情况下为shift)允许您偏移放置此列的位置。指定正值意味着将对角线向右移动,在我们的例子中,我们将其向右移动shift,因此我们的输出结果。由于您实际上是在向右移动的每个位置截断向量,因此您需要将向量中 1 的数量减少这么多。

    到目前为止,我还没有解释为什么在最后一行代码中需要 abs 调用 shift。需要abs 调用的原因是为了适应负班次。如果我们在第三行代码中没有 abs 调用,n-shift 本质上将向向量添加更多的 1,从而将我们的矩阵扩展到 n x n 之外。因为将对角线向左移动也会减少结果中看到的 1 的数量,这就是需要调用 abs 的原因,但您会注意到 diag 的第二个参数中的 shift 常量保持不变。

    这是一个带有负移位的演示,shift = -1,并且仍然保持大小为 10 x 10:

    A =
    
         0     0     0     0     0     0     0     0     0     0
         1     0     0     0     0     0     0     0     0     0
         0     1     0     0     0     0     0     0     0     0
         0     0     1     0     0     0     0     0     0     0
         0     0     0     1     0     0     0     0     0     0
         0     0     0     0     1     0     0     0     0     0
         0     0     0     0     0     1     0     0     0     0
         0     0     0     0     0     0     1     0     0     0
         0     0     0     0     0     0     0     1     0     0
         0     0     0     0     0     0     0     0     1     0
    

    【讨论】:

    • 只是补充说应该是diag(ones(n-1,1),1)
    • @zahmati - 啊!谢谢!我将它概括为任何值shift
    【解决方案2】:

    您只需调用bsxfun 即可获得所需的输出 -

    n = 10
    shift = 1
    A = bsxfun(@eq,[1:n].',1-shift:n-shift)
    

    由于您基本上是在创建一个稀疏矩阵,因此您也可以使用sparse -

    n = 10
    shift = 1
    A = full(sparse(1:n-shift,1+shift:n,1,n,n))
    

    【讨论】:

    • sparse 方法非常好!
    • @rayryeng 是的!这让我很震惊! :)
    • Sweet :) 还看到您将其概括为任何班次值。酷!
    • @rayryeng 是的!你是这背后的灵感! ;)
    【解决方案3】:

    这个游戏已经很晚了,但我们不要忘记使用线性索引的最简单解决方案:

    n=10; a=zeros(n);
    a(n+1:n+1:end)=1
    

    显然,这只是解决了 shift=1 的情况,但你明白了......

    【讨论】:

    • 不错的 +1 顺便说一句,您可以将初始 nshift 相乘以概括它。像这样:a(shift*n+1:n+1:end)=1 虽然它只适用于正值
    • 不错。想知道如何仅通过线性索引来做到这一点。
    • 它也适用于负值:例如对于 -4 班次:a((1+4):n+1:end-n*(4-1))=1
    【解决方案4】:

    您可以使用circshift 并在将矩阵传递给函数之前对其进行修复:

    >> shift = 1;
    >> N=10;
    >> A=circshift(diag(1:N>shift),-shift)
    A =
         0     1     0     0     0     0     0     0     0     0
         0     0     1     0     0     0     0     0     0     0
         0     0     0     1     0     0     0     0     0     0
         0     0     0     0     1     0     0     0     0     0
         0     0     0     0     0     1     0     0     0     0
         0     0     0     0     0     0     1     0     0     0
         0     0     0     0     0     0     0     1     0     0
         0     0     0     0     0     0     0     0     1     0
         0     0     0     0     0     0     0     0     0     1
         0     0     0     0     0     0     0     0     0     0
    

    1:N>shift 将是 0 用于拳头 shift 的位置数,1 用于其余位置。

    【讨论】:

      【解决方案5】:

      这是另一种选择:(有点类似于 Divakar 的 bsxfun 方法)

      n=10;
      shift = 1;
      c = repmat(1-shift:n-shift,n,1,1);
      r = repmat((1:n).',1,n,1);
      out = r == c
      

      这也可以是单行:

      out = repmat((1:n).',1,n,1) == repmat(1-shift:n-shift,n,1,1)
      

      【讨论】:

      • 逻辑比较的好工作。
      【解决方案6】:

      这是另一个(也适用于负移位)

      rot90(blkdiag(zeros(abs(shift)),rot90(eye(n))),sign(shift))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多