2016-09-21 57 views
1

我想使用:運營商,但定期提取矢量元素。作爲一個例子,說a={1,2,3, ..., 10},我想提取元素的步驟2,改變參考。然後我想獲得MATLAB:定期提取元素

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

在MATLAB中是否存在一個關鍵字來強制它是週期性的?或者我必須首先將circshift應用於陣列,然後提取?

回答

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

你可能產生兩個索引集:id1 = 1:2:length(a);id2 = 2:2:length(a);。然後你可以在這些索引數組上使用circshift來獲得所需的數組。

1

你說過一個矢量,所以我會假設你的意思是a = [1,2,3, ..., 10]。如果a是一個單元格,請在下面的代碼中使用b = cell2mat(a)並用b替換a

我想你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) 
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)