Octave / Matlab 中的数组操作:circshift。

3
我正在尝试同时将数组(外部单元格)的第一个和最后一个单元格向内移动。这是我尝试使用数组进行的内部动画。如内部动画所示。正如您所见,外部单元格同时从两端向内移动。
这里有一张图片,但是动画效果更好,请注意数组可能具有偶数或奇数个单元格。
Inner rotation steps
1 2 3 4 5 6 7
4 1 2 3 6 7 5
3 4 1 2 7 5 6

向内方向

2) 我试图使用circshift(我认为是最快的方法)同时将数组的中间单元格向外移动。

这里是一个向外的动画,展示了我想要做的事情outward animation。正如您所看到的,信号的中心同时向左右移动。

这是一张图片,但动画能更好地显示,请注意数组可能有偶数或奇数个单元格。

Outer rotation steps
1 2 3 4 5 6 7
2 3 4 1 7 5 6
3 4 1 2 6 5 7

enter image description here

Example: inward
a = (1:7)
y=circshift(A,[0 -2]) %shift end of array inward
3   4   5   6   7   1   2

a = (1:7)
y=circshift(A,[0 2]) %shift beginning of array inward
6   7   1   2   3   4   5

不确定如何使用circshift使中间的单元格向外移动,或者同时使外部的单元格向内移动

我不确定如何从中心开始使用circshift,并将数组向外/向内移动以获得此效果。

请注意,我不是要获取此方程式,我只是想让数组以相同的方式移动。 我正在使用与matlab兼容的octave 3.8.1。


如果 a = 1:7,那么您想向内移动所有内容,因此在进行一次移动后,您希望得到... ? 1 2 3 5 6 7 ??的位置应该填什么呢?如果您有偶数个数字,我猜您希望将 1:8 移位为 4 1 2 3 6 7 8 5,对吗?这里提供一些手动计算的数字示例会非常有帮助。 - Dan
@Dan,这正是我在数字方面遇到的问题。我可以使用动画来可视化它,但在进行数字计算时会感到困惑,我不确定接下来该做什么,因此我制作了动画,以显示我正在尝试对数组执行的确切操作。http://youtu.be/65iu4rajIEQ 和 http://youtu.be/hHUqWoRmvbk - Rick T
我不确定我完全理解你想要什么,但是你可以在矩阵上使用circshift。如果你的信号的每一侧都占据矩阵的一列,你可以使用一个函数调用,然后简单地展平它(不过在创建矩阵时你必须反转其中一个信号)。另一种方法是将索引简单地移动到您的信号(也可以是矩阵形式)。 - carandraug
@Dan,我添加了一些数字,希望这有所帮助。 - Rick T
2
为什么不将数组分成两个部分,然后单独使用circshift,如circshift(part1,[0 1])circshift(part2,[0 -1]) - Divakar
2个回答

2
A = 1:7;

split = ceil(numel(A)/2);

n = 2;
A(1:split) = circshift(A(1:split), [0, n]);
A(split+1:end) = circshift(A(split+1:end), [0, -n]);

如果您愿意,可以将最后三行放在循环中。 如果希望向内或向外移动,请更改n的符号。

1
为了Octave中的正确运行,我需要调整这两行代码:A(1:split) = circshift(A(1:split), [0 n]);A(split+1:end) = circshift(A(split+1:end), [0 -n]);非常感谢!!! - Rick T

0

除了使用circshift,构建新的索引怎么样?

A = 1:7;

halfLen = ceil(length(A)/2); % or use ceil to 
idcsOutward = [2:halfLen,1,length(A),(halfLen+1):(length(A)-1)];

B1 = A(idcsOutward)
B2 = B1(idcsOutward)

% and inward:
idcsInward = [halfLen,1:(halfLen-1),(halfLen+2):length(A),halfLen+1];

C1 = A(idcsInward)
C2 = C1(idcsInward)

结果是:

B1 =
     2     3     4     1     7     5     6

B2 =
     3     4     1     2     6     7     5

C1 =
     4     1     2     3     6     7     5

C2 =
     3     4     1     2     7     5     6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接