我有来自van Loan的书科学计算导论的Matlab函数。 它产生一个矩阵C,其中每一行都是前一行,每个元素都向右移动一行。我想修改它,以便向右移动,但我在逻辑方面遇到了一些麻烦。
特别是,下面的循环对右移是否有意义?
for i=2:n
C(i,:)=[C(i-1, n-2) C(i-1, 1:n-1)];
end
function C= circulantShift(a) %shifts to left
a=[1 2 3 4];
n=length(a);
C=zeros(n,n);
C(1,:)=a;
for i=2:n
C(i, :)=[C(i-1, n) C(i-1, 1:n-1)];
end
答案 0 :(得分:1)
要转移到左侧,您需要使用:
C(i,:)=[C(i-1, 2:n) C(i-1, 1)];
C =
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
答案 1 :(得分:1)
首先:函数circulantShift(a)
向右移动,而不是向左移动。
逻辑如下:
在matlab中[a b]
执行水平连接。因此[C(i-1, n) C(i-1, 1:n-1)]
构建一条由上面一行中的第n个(最后一个)数字组成的行,然后是上面一行中的第一个1:n-1个数字。这显然是向右的循环转移。
如果你想向左移动,你可以反过来。从上面的行中取第2到第n个数字,然后是上面一行中的第一个数字。像这样:
[C(i-1, 2:n) C(i-1, 1)]