我想知道是否有可能在Matlab中顛倒嵌套單元陣列的順序。在Matlab中嵌套單元陣列的反序顛倒
如果我有一個單元陣列 A{a,b}{c,d}
有沒有辦法把它轉換成 B{c,d}{a,b}
?
目標是得到 C={c,d}(a,b)
能夠在一個和以後的總結b。
如果我做 C=cellfun(@cell2mat, A, 'UniformOutput', false);
那麼C將有一個形狀C{a,b}(c,d)
,這不幫我進一步。
我將不勝感激任何幫助,提示或意見。
安娜
我想知道是否有可能在Matlab中顛倒嵌套單元陣列的順序。在Matlab中嵌套單元陣列的反序顛倒
如果我有一個單元陣列 A{a,b}{c,d}
有沒有辦法把它轉換成 B{c,d}{a,b}
?
目標是得到 C={c,d}(a,b)
能夠在一個和以後的總結b。
如果我做 C=cellfun(@cell2mat, A, 'UniformOutput', false);
那麼C將有一個形狀C{a,b}(c,d)
,這不幫我進一步。
我將不勝感激任何幫助,提示或意見。
安娜
不能確定,如果您A
varaible具有在A{a,b}{c,d}
級別號,甚至多個嵌套細胞,但如果我們在單元格中假設單數,你可以在2個小步
讓我們先創建一些測試數據。爲了便於代碼驗證,每個值都由關於其原始位置/索引的信息按模式構建:ab.cd
。例如A{1,4}{2,3}
的值爲14.23
。
% Index size
a = 5;
b = 4;
c = 3;
d = 2;
% Cell values
[ai, bi] = ind2sub([a b], 1:a*b);
abVal = 10*ai + bi;
[ci,di] = ndgrid(1:c,1:d);
cdVal = ci/10+di/100;
% Built up A
A = cell(a,b);
for i = 1:numel(A)
A{i} = num2cell(abVal(i) + cdVal);
end
這裏真的不需要num2cell
,但有沒有更好地模仿你的數據。如果您有數字(不是單元格)或更深的嵌套單元格,則可能必須在下面最後一行中使用括號(:)
而不是大括號{:}
。但對於這個例子,以下是它。
% Flatten the 2-level nested cell (could use vercat instead of horcat)
A_flat = horzcat(A{:});
A_flat = horzcat(A_flat{:}); % Could also use [A_flat{:}] here
現在使用的事實,值被放置在偶數索引距離,並挑選出EVERE c x b
值。
% Built up re-arrange cell
A_reOrdered = cell(c,d);
for i = 1:c*d
A_reOrdered{i} = reshape(A_flat(i:c*d:end), a, b);
end
在這裏,我實際上已經轉變,從A{a,b}{c,d}
到A{c,d}(a,b)
。如果你想在底部即A{c,d}{a,b}
細胞結構,只是把一個num2cell
的reshape
之前在for
循環
對於一些示例衣被合計:
>> A_reOrdered{3,1}
ans =
11.31 12.31 13.31 14.31
21.31 22.31 23.31 24.31
31.31 32.31 33.31 34.31
41.31 42.31 43.31 44.31
51.31 52.31 53.31 54.31
>> A_reOrdered{3,1}(5,2)
ans =
52.31
原本是放置在
>> A{5,2}{3,1}
ans =
52.31
但是,如果目標的確是要計算一些總和,那麼可以在展平步驟之後停止並在該數據直接。研究A_flat
的模式,我想你會看到它。
例如總結所有值用於特定 'B'
nB = a*c*d;
for ib = 1:b
bSum(ib) = sum(A_flat((ib-1)*nB + (1:nB)));
end
% ... or without the for-loop
bSum = arrayfun(@(x) sum(A_flat(x + (1:nB))), nB*(0:b-1));
bSum =
936.45 966.45 996.45 1026.5