在matlab中从矩阵中选择元素

时间:2012-02-20 18:37:16

标签: matlab matrix

我有一个36 x 2的矩阵,但是我想分离这些元素,从上到下给我18个2 x 2矩阵。例如。如果我有一个矩阵:

1  2
3  4
5  6
7  8
9  10
11  12
13  14
...  ...

我想把它分成单独的矩阵:

M1 = 1  2
     3  4

M2 = 5  6
     7  8

M3 = 9  10
     11 12   

...等。

3 个答案:

答案 0 :(得分:3)

以下示例代码可能很有用:

a=rand(36,2);
b=reshape(a,2,2,18)

然后使用b的第3个索引,您可以访问18个2x2矩阵,例如。 b(:,:,2)给出第二个2x2矩阵。

答案 1 :(得分:2)

我认为你问题的直接答案是:

sampledata = [...
    0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18; ... 
    0.19 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.30 1.31 1.32 1.33 1.34 1.35 1.36];

for ix = 1:(size(sampledata,2)/2)
    assignin('base',['M' sprintf('%02d',ix)], sampledata(:,ix*2+[-1 0]))
end

这创建了18个变量,名为“M01”到“M18”,带有sampledata矩阵的片段。


但是,请不要使用这样的动态变量名。它会使它触及的每一​​段代码复杂化。使用单元阵列,3D阵列(由@Johannes_Endres +1 BTW建议)或结构。任何不需要你以后写这样的东西的东西:

%PLEASE DO NOT USE THIS
%ALSO DO NOT BACK YOURSELF INTO A CORNER WHERE YOU HAVE TO DO IT IN THE FUTURE
varNames = who('M*');
for ix = 1:length(varNames )
    str = ['result(' num2str(ix) ') = some_function(' varNames {ix} ');'];
    eval(str);
end

我见过这样的代码,维护缓慢而且非常麻烦,更不用说内部美容仪的头痛和疼痛了。

答案 2 :(得分:0)

x = reshape(1:36*2,[2 36])'

k = 1
for i = 1:2:35
    eval(sprintf('M%d = x(%d:%d,:);',k,i,i+1));
    k = k+1;
end