W matlab mam macierz komórek 4x5, gdzie każda komórka składa się z wektora 121x1.wektory konkatenacji macierzy komórkowej w matlab
Jaki jest najprostszy sposób utworzenia 3-dim 4x5x121 matrix unikając 2-krotnie pętli.
W matlab mam macierz komórek 4x5, gdzie każda komórka składa się z wektora 121x1.wektory konkatenacji macierzy komórkowej w matlab
Jaki jest najprostszy sposób utworzenia 3-dim 4x5x121 matrix unikając 2-krotnie pętli.
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);
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.
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]
.
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 :) –
@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
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ż.
+1, chociaż uważam, że pierwszy "celofan" potrzebuje 'uniformoutput = false' –
@RodyOldenhuis: dzięki za spostrzeżenie! – Jonas
Potrzebuje również nawiasów: 'permCell = cellfun (@ (x) permute (x, [3,2,1]), inCell, 'uniformOutput', false);' – Pursuit