2012-10-22 16 views

Odpowiedz

7

jedną stronę (niekoniecznie najszybciej)

%# 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, chociaż uważam, że pierwszy "celofan" potrzebuje 'uniformoutput = false' –

+0

@RodyOldenhuis: dzięki za spostrzeżenie! – Jonas

+0

Potrzebuje również nawiasów: 'permCell = cellfun (@ (x) permute (x, [3,2,1]), inCell, 'uniformOutput', false);' – Pursuit

4

Załóżmy

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

następnie normalnie powiedzieć

cat(3, A{:}) 

ale które otrzymano po 121 1- tablica by-20. W Twoim przypadku, to dodatkowy krok jest potrzebny:

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

lub, alternatywnie,

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

chociaż

>> 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 

więc komenda cell2mat jest prawie 5 razy wolniej niż reshape z ekspansja. Użyj tego, który najlepiej pasuje do Twojego przypadku.

1

Odpowiedzi od Jonasa i Rody są oczywiście w porządku. Niewielka udoskonalenie wydajności jest reshape twoi wektorów w komórkach zamiast permute nich

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

i zdecydowanie najszybszy, jeśli można odpocząć wymagania dotyczące wymiarów wyjściowych, to po prostu łączenie wektorów komórkowych i przekształcanie

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

który daje matrycę [121 x 4 x 5].

+0

Który jest ** nie ** szybszy niż 'cat (3, A {:})' (dobrze * ty * powiedziałeś, że wymagania dotyczące wymiarów wyjściowych mogą być luźniejsze :) –

+0

@RodyOldenhuis oh, ok. Widzę, że odnosisz się do swojej odpowiedzi. Przepraszam. Tęskniłem za tą częścią :) Ale musisz też zmienić kształt. 'size (cat (3, c {:})) ans = 121 1 20' – angainor

0

Jak ten temat, unikając cellfun:

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

nie Porównaliśmy prędkość do innych sugestii chociaż.