我有一個4D矩陣(dims-x,y,z,t)。我想將其重塑爲一個長度爲x*y*z
的1D單元陣列,其中每個元素是長度爲t
的向量,它捕獲每個卷位置(x,y,z)
上的所有元素。之後,我需要重新塑造它。使用Matlab將4d矩陣重塑成向量單元陣列
我想循環數組來做到這一點,因爲我無法真正找到一個內置的函數來做到這一點。
任何見解都會超級有用!謝謝!
我有一個4D矩陣(dims-x,y,z,t)。我想將其重塑爲一個長度爲x*y*z
的1D單元陣列,其中每個元素是長度爲t
的向量,它捕獲每個卷位置(x,y,z)
上的所有元素。之後,我需要重新塑造它。使用Matlab將4d矩陣重塑成向量單元陣列
我想循環數組來做到這一點,因爲我無法真正找到一個內置的函數來做到這一點。
任何見解都會超級有用!謝謝!
看看這是你想要的:
x = randn(2,3,4,5); % example data
x = reshape(x, [], size(x,4)); % collapse first three dimensions
x = mat2cell(x, ones(1,size(x,1)), size(x,2)); % split first dimension into cells
路易斯的回答是偉大的,是半矢量(mat2cell
使用一個循環)。如果你想要的是一個大小爲x*y*z
的單元陣列,其中每個元素的長度爲t
,可以在每個卷位置上使用一個循環,並提取「時間上」在4D中佔據這個點的元素。確保你得到任何單身維度來獲得結果向量。如果你想採用循環方法,這是需要考慮的事情。假設你的矩陣稱爲A
,請嘗試以下操作:
B = cell(size(A,1)*size(A,2)*size(A,3), 1);
count = 1;
for ii = 1 : size(A,1)
for jj = 1 : size(A,2)
for kk = 1 : size(A,3)
B{count} = squeeze(A(ii,jj,kk,:));
count = count + 1;
end
end
end
爲了得到這個回四維矩陣形式,你只是套用同樣的邏輯,但在相反的:
Ar = zeros(size(A));
count = 1;
for ii = 1 : size(A,1)
for jj = 1 : size(A,2)
for kk = 1 : size(A,3)
Ar(ii,jj,kk,:) = B{count};
count = count + 1;
end
end
end
像路易斯解決方案,但更簡單,更完整:
% Transform to cell
x = randn(2,3,4,5); % example data
y = reshape(x, [], size(x,4));
z = num2cell(y,2);
% transform back
x = reshape(cat(1,z{:}), size(x));
非常好。您可以通過將'reshape'的第二個參數設爲'size(x)'來簡化重新變形回到4D。打敗所有這些數字! – rayryeng
@rayryeng真的,謝謝! –
幹得好!我一直忘記'num2cell'的雙輸入版本 –
心理學家,呃? :-) –
@LuisMendo我會這麼說:)我對這個問題的編輯是我如何解釋這個問題......「長矢量」和「細胞」不明顯地在一起。 – rayryeng
我反過來解釋它。讓我們等待OP的確認... –