2012-10-22 20 views

risposta

7

Un modo (non necessariamente il più veloce)

%# convert all arrays in the cell array inCell to 1x1x121 
permCell = cellfun(@(x)permute(x,[3,2,1]),inCell,'uniformOutput',false); 

%# catenate 
array = cell2mat(permCell); 
+1

+1, anche se credo che il primo 'cellfun' abbia bisogno di un' uniformoutput = false' –

+0

@RodyOldenhuis: grazie per averlo notato! – Jonas

+0

Ha bisogno anche di parentesi: 'permCell = cellfun (@ (x) permute (x, [3,2,1]), inCell, 'uniformOutput', false);' – Pursuit

4

Supponiamo

A = cellfun(@(~)rand(121,1), cell(4,5), 'uniformoutput', false) 

poi normalmente direi

cat(3, A{:}) 

ma che darebbe un 121-by-1- matrice by-20. Per il vostro caso, è necessario un passo in più:

A = cellfun(@(x)permute(x,3,2,1), A, 'uniformoutput', false) 
A = reshape([A{:}], size(A,1), size(A,2), size(A{1},3)) 

o, in alternativa,

A = cellfun(@(x)permute(x,3,2,1), A, 'uniformoutput', false) 
A = cell2mat(A); 

anche se

>> start = tic; 
>> for ii = 1:1e3 
>>  B1 = reshape([A{:}], size(A,1), size(A,2), size(A{1},3)); end 
>> time1 = toc(start); 
>> 
>> start = tic; 
>> for ii = 1:1e3 
>>  B2 = cell2mat(A); end 
>> time2 = toc(start); 
>> 
>> time2/time1 
ans = 
    4.964318459657702e+00 

così il comando cell2mat è quasi 5 volte più lento del reshape del espansione. Usa quello che sembra più adatto al tuo caso.

1

Le risposte di Jonas e Rody sono ovviamente buone. Una piccola raffinatezza performance è a reshape i vettori nelle cellule piuttosto che permute essi:

permCell = cellfun(@(x)reshape(x,[1 1 numel(x)]), inCell, 'uni',false); 
A = reshape([permCell{:}], [size(inCell) numel(inCell{1,1})]); 

e di gran lunga il più veloce, se si può rilassare i requisiti circa le dimensioni di output, è semplicemente concatenando i vettori cellulari e rimodellare

A = reshape([inCell{:}], [numel(inCell{1,1}) size(inCell)]); 

che produce una matrice [121 x 4 x 5].

+0

Che è ** non ** più veloce di 'cat (3, A {:})' (beh * tu * hai detto che i requisiti sulle dimensioni di output potrebbero essere rilassati :) –

+0

@RodyOldenhuis oh, ok. Vedo che ti riferisci alla tua risposta. Scusate. Ho perso quella parte :) Ma poi hai anche bisogno di una rimodellazione. 'size (cat (3, c {:})) ans = 121 1 20' – angainor

0

Come su questo, evitando cellfun:

output=permute(cell2mat(permute(input,[3 1 2])),[2 3 1]); 

non hanno paragonato velocità per gli altri suggerimenti però.