Trong mẫu hình Tôi có một mảng ô 4x5 trong đó mỗi ô chứa một véc tơ 121x1.vectơ nối của một mảng ô trong MATLAB
Cách dễ nhất để tạo ma trận 4x5x121 3-dim tránh vòng lặp 2 lần là gì.
Trong mẫu hình Tôi có một mảng ô 4x5 trong đó mỗi ô chứa một véc tơ 121x1.vectơ nối của một mảng ô trong MATLAB
Cách dễ nhất để tạo ma trận 4x5x121 3-dim tránh vòng lặp 2 lần là gì.
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);
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.
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]
.
Đó 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 :) –
@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
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ù.
+1, mặc dù tôi tin rằng 'cellfun' đầu tiên cần một' uniformoutput = false' –
@RodyOldenhuis: cảm ơn vì đã phát hiện ra điều này! – Jonas
Cũng cần ngoặc: 'permCell = cellfun (@ (x) permute (x, [3,2,1]), inCell, 'uniformOutput', false);' – Pursuit