我想使用:
- 运算符从向量中提取元素,但要定期。例如,说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
应用于数组,然后提取?
答案 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)