2012-10-22 40 views

Trả lời

7

Một cách (không nhất thiết phải là nhanh nhất)

%# 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, mặc dù tôi tin rằng 'cellfun' đầu tiên cần một' uniformoutput = false' –

+0

@RodyOldenhuis: cảm ơn vì đã phát hiện ra điều này! – Jonas

+0

Cũng cần ngoặc: 'permCell = cellfun (@ (x) permute (x, [3,2,1]), inCell, 'uniformOutput', false);' – Pursuit

4

Giả sử

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

sau đó bình thường tôi sẽ nói

cat(3, A{:}) 

nhưng điều đó sẽ cung cấp cho một 121-by-1- mảng by-20. Đối với trường hợp của bạn, thêm một bước là cần thiết:

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

hoặc, cách khác,

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

mặc dù

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

do đó lệnh cell2mat là chậm hơn so với reshape của gần 5 lần sự bành trướng. Sử dụng cái nào có vẻ phù hợp nhất cho trường hợp của bạn.

1

Câu trả lời của Jonas và Rody tất nhiên là tốt. Một màn trình diễn tinh tế nhỏ là reshape vectơ của bạn trong các tế bào chứ không phải permute họ:

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

Và đến nay là nhanh nhất, nếu bạn có thể thư giãn các yêu cầu về kích thước đầu ra, chỉ đơn giản là concatenating các vectơ di động và định hình lại

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

sản lượng ma trận [121 x 4 x 5].

+0

Đó là ** không ** nhanh hơn 'cat (3, A {:})' (well * you * cho biết các yêu cầu về kích thước đầu ra có thể được thoải mái :) –

+0

@RodyOldenhuis oh, ok. Tôi thấy bạn nói đến câu trả lời của bạn. Lấy làm tiếc. Tôi bị mất phần đó :) Nhưng bạn cũng cần một thay đổi hình dáng sau đó. 'kích thước (cat (3, c {:})) ans = 121 1 20' – angainor

0

Làm thế nào về vấn đề này, tránh cellfun:

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

Chưa so tốc độ với những gợi ý khác mặc dù.

Các vấn đề liên quan