MATLAB:定期提取元素

时间:2016-09-21 20:01:07

标签: matlab

我想使用: - 运算符从向量中提取元素,但要定期。例如,说a={1,2,3, ..., 10}并且我想以2的步骤提取元素,更改引用。然后我想得到

ref 1: 1 3 5 7 9
ref 2: 2 4 6 8 10
ref 3: 3 5 7 9 1
...

MATLAB中是否有关键字强制它是周期性的?或者我是否必须首先将circshift应用于数组,然后提取?

4 个答案:

答案 0 :(得分:4)

您可以使用模运算来构建索引:mod(...-1, numel(a))+1。需要-1+1,因此结果索引是从1开始的(不是从0开始)。

a = [1 2 3 4 5 6 7 8 9 10]; % vector to be indexed
ref = 3; % first value for index
step = 2; % step for index
ind = mod(ref+(0:step:numel(a)-1)-1,numel(a))+1; % build index
result = a(ind); % apply index

答案 1 :(得分:1)

您可能会生成两组索引:id1 = 1:2:length(a);id2 = 2:2:length(a);。然后,您可以在这些索引数组上使用circshift来获取所需的数组。

答案 2 :(得分:1)

你说了一个向量,所以我假设你的意思是a = [1,2,3, ..., 10]。如果a是一个单元格,请使用b = cell2mat(a)并将a替换为下面代码中的b

我认为你circshift是最好的方法,但你可以很快地完成这项工作

a = 1:10;
acirc = cell2mat(arrayfun(@(n) circshift(a', [-n,0]), 0:length(a)-1, 'uni', 0))';
aout = acirc(:, 1:2:end)

这使得a的矩阵从0:9移位。然后它会掉落每个第二个元素。然后,如果你想要一个单元格数组

aout = num2cell(aout,2)

答案 3 :(得分:1)

首先将两个范围[1:10]水平连接作为要提取的索引:

IDX = [1:10 1:10]

然后使用函数提取从n begin开始的step元素:

ref = @(begin,step, n) IDX(begin : step : begin+(n * step)-1 );

示例:

ref(1,2,5)
ref(2,2,5)
ref(3,2,5)
ref(4,2,5)