Matlab身份转移矩阵

时间:2015-05-14 06:30:39

标签: matlab matrix binary

是否有任何内联命令在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的组合很好但是需要另一个命令来修复它。有更简单的方法吗? (只用一个简单的语法)

6 个答案:

答案 0 :(得分:12)

尝试将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,其中第一个参数是一个列向量,它创建一个矩阵,并将列向量作为沿此矩阵对角线的系数放置。第二个参数(在您的情况下为shift)允许您偏移放置此列的位置。指定正值意味着将对角线向右移动,在我们的示例中,我们将shift向右移动,因此我们的输出结果。由于你实际上截断了向右移动的每个位置的向量,你需要减少向量中的1的数量。

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

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

shift = -1

答案 1 :(得分:7)

只需拨打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))

答案 2 :(得分:7)

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

n=10; a=zeros(n);
a(n+1:n+1:end)=1
显然,这只是解决了shift = 1的情况,但你明白了......

答案 3 :(得分:2)

您可以使用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>shift0个名额,

shift将为1,其余为a = b

答案 4 :(得分:1)

这是另一种选择:(与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)

答案 5 :(得分:1)

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

rot90(blkdiag(zeros(abs(shift)),rot90(eye(n))),sign(shift))
相关问题