使用circshift octave / matlab进行数组操作

时间:2014-11-06 15:09:06

标签: arrays matlab octave

1)我试图首先移动一个阵列(外部单元格),同时将最后一个单元格向内移动。这是我尝试用数组做的内心动画 inward animation。正如您所看到的那样,外部细胞同时向内(从末端)移动

这是一张照片,但动画显示效果更好请注意阵列可能有一个偶数或奇数的单元格

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

Inward direction

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向外移动中间单元格,或者外部单元格同时向内移动

我不确定如何从中心开始旋转并向外/向内移动阵列以获得此效果。

请注意我并没有试图得到这个等式我只是试图让阵列以相同的方式移动。我使用与matlab兼容的octave 3.8.1。

2 个答案:

答案 0 :(得分: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 :(得分: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