Matlab恒等移位矩阵

Matlab identity shift 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]

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

尝试使用 diag call in combination with 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) 也对应于矩阵的总数 rows/columns 并减去你向右移动的次数。接下来,您可以使用 diag,其中第一个参数是一个列向量,它创建一个 zero 矩阵,并将列向量作为系数沿该矩阵的对角线放置。第二个参数(shift 在您的例子中)允许您 offset 放置此列的位置。指定正值意味着将对角线向右移动,在我们的例子中,我们将其向右移动 shift,因此我们的输出结果。由于您实际上是在向右移动的每个位置截断向量,因此您需要将向量中 1 的数量减少这么多。

到现在为止,我还没有解释为什么在最后一行代码中需要abs调用shift。需要调用 abs 的原因是为了适应负偏移。如果我们在第三行代码中没有调用 absn-shift 本质上就是 向向量添加 个 1,从而扩展我们的矩阵超过 n x n。因为向左移动对角线也会减少结果中看到的 1 的数量,这就是为什么需要调用 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

您只需调用 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))

这场比赛已经晚了,但让我们不要忘记使用线性索引的最简单解决方案:

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

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

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

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)

您可以使用 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 第一个 shift 个名额将是 0 个,其余 1 个名额。

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

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