2016-06-12 100 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