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