2016-11-02 265 views
0

我有一個4D矩陣(dims-x,y,z,t)。我想將其重塑爲一個長度爲x*y*z的1D單元陣列,其中每個元素是長度爲t的向量,它捕獲每個卷位置(x,y,z)上的所有元素。之後,我需要重新塑造它。使用Matlab將4d矩陣重塑成向量單元陣列

我想循環數組來做到這一點,因爲我無法真正找到一個內置的函數來做到這一點。

任何見解都會超級有用!謝謝!

回答

4

看看這是你想要的:

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 
3

路易斯的回答是偉大的,是半矢量(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 
+1

心理學​​家,呃? :-) –

+0

@LuisMendo我會這麼說:)我對這個問題的編輯是我如何解釋這個問題......「長矢量」和「細胞」不明顯地在一起。 – rayryeng

+0

我反過來解釋它。讓我們等待OP的確認... –

3

像路易斯解決方案,但更簡單,更完整:

% 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)); 
+1

非常好。您可以通過將'reshape'的第二個參數設爲'size(x)'來簡化重新變形回到4D。打敗所有這些數字! – rayryeng

+1

@rayryeng真的,謝謝! –

+0

幹得好!我一直忘記'num2cell'的雙輸入版本 –