In MATLAB ho un array di celle 4x5 in cui ogni cella è costituita da un vettore 121x1.concatenare i vettori di un array di celle in MATLAB
Qual è il modo più semplice per creare una matrice 4x5x121 3 dim, evitando un loop di 2 volte.
In MATLAB ho un array di celle 4x5 in cui ogni cella è costituita da un vettore 121x1.concatenare i vettori di un array di celle in MATLAB
Qual è il modo più semplice per creare una matrice 4x5x121 3 dim, evitando un loop di 2 volte.
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);
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.
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]
.
Che è ** non ** più veloce di 'cat (3, A {:})' (beh * tu * hai detto che i requisiti sulle dimensioni di output potrebbero essere rilassati :) –
@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
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ò.
+1, anche se credo che il primo 'cellfun' abbia bisogno di un' uniformoutput = false' –
@RodyOldenhuis: grazie per averlo notato! – Jonas
Ha bisogno anche di parentesi: 'permCell = cellfun (@ (x) permute (x, [3,2,1]), inCell, 'uniformOutput', false);' – Pursuit