Matlab身份转移矩阵

zah*_*ati 11 binary matlab matrix

是否有任何内联命令在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]
Run Code Online (Sandbox Code Playgroud)

组合circshift并且eye很好但是它需要另一个命令来修复它.有更简单的方法吗?(只用一个简单的语法)

ray*_*ica 13

尝试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
Run Code Online (Sandbox Code Playgroud)

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

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

这是一个带有负移位的演示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
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 7

您只需拨打一次电话即可获得所需的输出bsxfun-

n = 10
shift = 1
A = bsxfun(@eq,[1:n].',1-shift:n-shift)
Run Code Online (Sandbox Code Playgroud)

由于您基本上是在创建稀疏矩阵,或者您可以使用sparse-

n = 10
shift = 1
A = full(sparse(1:n-shift,1+shift:n,1,n,n))
Run Code Online (Sandbox Code Playgroud)


bla*_*bla 7

在这个游戏的后期,但让我们不要忘记使用线性索引的最简单的解决方案:

n=10; a=zeros(n);
a(n+1:n+1:end)=1
Run Code Online (Sandbox Code Playgroud)

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