在matlab中从矩阵中选择元素

在matlab中从矩阵中选择元素,matlab,matrix,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 ……等等 以下示例代码可能有用: a=rand(36,2); b=reshape(a,2,2,18) 然后,使用第三个索引b

我有一个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   

……等等

以下示例代码可能有用:

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

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

以下示例代码可能有用:

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

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

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

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
这将使用
sampledata
矩阵的片段创建18个变量,命名为“M01”到“M18”


但是,请不要像这样使用动态变量名。它将使它涉及的其他每一段代码复杂化。使用单元阵列、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

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

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

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
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
这将使用
sampledata
矩阵的片段创建18个变量,命名为“M01”到“M18”


但是,请不要像这样使用动态变量名。它将使它涉及的其他每一段代码复杂化。使用单元阵列、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

我见过这样的代码,而且维护起来非常缓慢和繁琐,更不用说让你的内部美容仪头疼和痛苦了。

我尝试过使用线性索引来提取第1行第1列中的元素,比如M(1,1)。还有M(1:2),但这会将第一行提取到第2列。而我需要向下提取,即从32 x 2矩阵中选择16 x 2矩阵。我想我可以单独选择2 x 2矩阵的4个元素,我想给每个元素分配一个变量名,然后从中形成矩阵,但对于16个矩阵来说,这需要花费太长的时间。答案太复杂了,除了欧·恩德斯先生的矩阵之外,我有的矩阵是这样的:我尝试使用线性索引,比如M(1,1)提取第1行第1列中的元素。还有M(1:2),但这会将第一行提取到第2列。而我需要向下提取,即从32 x 2矩阵中选择16 x 2矩阵。我想我可以单独选择2×2矩阵的4个元素,我想给每个变量分配一个变量名,然后从它们中形成矩阵,但是对于16个矩阵来说,这要花费太长的时间。除了Mr.Edrr',答案太复杂了。我的矩阵是这样的:也可以考虑单元数组,也可以考虑单元数组。
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