2016-12-01 74 views
0

我想知道是否有可能在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),這不幫我進一步。

我將不勝感激任何幫助,提示或意見。

安娜

回答

0

不能確定,如果您A varaible具有在A{a,b}{c,d}級別號,甚至多個嵌套細胞,但如果我們在單元格中假設單數,你可以在2個小步

    使這
  1. 拼合你的
  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}細胞結構,只是把一個num2cellreshape之前在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