我想使用:
運營商,但定期提取矢量元素。作爲一個例子,說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
應用於陣列,然後提取?
我想使用:
運營商,但定期提取矢量元素。作爲一個例子,說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
應用於陣列,然後提取?
您可以使用模運算構建索引: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
你可能產生兩個索引集:id1 = 1:2:length(a);
和id2 = 2:2:length(a);
。然後你可以在這些索引數組上使用circshift
來獲得所需的數組。
你說過一個矢量,所以我會假設你的意思是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: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)