2016-06-12 91 views
0

我有一個9x3矩陣,我細分爲三(3)3x3矩陣。現在我想創建一個for循環函數,將每個3x3矩陣存儲到一個變量中。將3x3矩陣存儲在變量for循環中

X=reshape(1:27,3,9)';   % sample 9x3 matrix 
xx = mat2cell(X,[3,3,3],3); % subdivide X matrix into 3x3 cell matrix 
for i:1:3 
    x(i) = xx{i,1}; %store the three cells into x1 x2 and x3 matrix 
end 

我知道這並不是它在matlab中的工作原理,而僅僅是爲了展示我想獲得的功能。

+1

你幾乎肯定不想這樣做。你想做什麼需要多個變量? – nkjt

+0

我想實現的是, –

回答

1

您可以使用eval函數。

X=reshape(1:27,3,9)';   % sample 9x3 matrix 
xx = mat2cell(X,[3,3,3],3); % subdivide X matrix into 3x3 cell matrix 
for i=1:3 
    eval(['x' num2str(i) ' = xx{' num2str(i) ',1};']); 
end 

不建議在所有你所要求的。事實上,我總是避免使用eval,因爲代碼沒有通過MATLAB編輯器檢查。

它也不是有多個變量,而是使用細胞,結構等在你的代碼的其餘部分更好地利用一個好主意。

+0

如果不推薦,請不要提示。 – Suever

+0

@Suever不建議在問題中提出什麼問題,這就是爲什麼我必須回答一個不推薦的問題。順便代碼完全工作。我也編輯了我的答案,以反映這一點。 – eulerleibniz

+0

不管它是否有效都不是問題。你至少可以提供一些選擇。 – Suever

0

這是你在找什麼?

X=reshape(1:27,3,9)'; 
for i=1:3 
    block = X(3*i-2:3*i,:); 
    disp(block);  
end 
+0

它分開!但塊值等於最後的3x3矩陣。我想用block1,block2,block3矩陣進行不同的計算。 –

0

做到這一點的最好方法是把實際上只是將其存儲在3D陣列,您可以沿着第三維度來訪問每個元素。原因在於MATLAB對使用矩陣的計算進行了優化,因此如果將所有數據保存在矩陣中,則可以在所有組件上以矢量化方式執行操作。

更好的是,您可以使用reshapepermute刪除需要創建它的for循環。

X = permute(reshape(X', [3 3 3]), [2 1 3]); 

% And access each element 
X(:,:,1) 
X(:,:,2) 
X(:,:,3) 

這將比使用單元陣列或eval更具性能。

+0

Got it!我將研究排列函數。但我現在明白爲什麼它更有效率。 –

+0

所有'排列'這裏做的是轉置每個3d「切片」 – Suever