基于第一列中的数字拆分矩阵

Saa*_*kke 4 matlab matrix

我有一个矩阵,其形式如下:

M = 
[1 4 56 1;
 1 3 5  1;
 1 3 6  4;
 2 3 5  0;
 2 0 0  0;
 3 1 2  3;
 3 3 3  3]
Run Code Online (Sandbox Code Playgroud)

我想根据第一列中给出的数字拆分此矩阵.所以我想把矩阵分成这个:

A = 
[1 4 56 1;
 1 3 5  1;
 1 3 6  4]

B = 
[2 3 5  0;
 2 0 0  0]

C =
[3 1 2  3;
 3 3 3  3]
Run Code Online (Sandbox Code Playgroud)

我通过制作以下循环尝试了这个,但这给了我所需的矩阵行:

for i = 1:length(M)
    if (M(i,1) == 1)
        A(i,:) = M(i,:);
    elseif (M(i,1) == 2)
        B(i,:) = M(i,:);
    elseif (M(i,1) == 3)
        C(i,:) = M(i,:);
    end
end
Run Code Online (Sandbox Code Playgroud)

例如,矩阵C的结果是:

C = 
[0 0 0 0;
 0 0 0 0;
 0 0 0 0;
 2 3 5 0;
 2 0 0 0]
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

附加信息:
实际数据在表单的第一列中有一个日期yyyymmdd.数据集跨越了几年,我希望将这个数据集拆分为每年的矩阵,然后是每个月.

H.M*_*ter 8

您可以使用它arrayfun来解决此任务:

M = [
1 4 56 1;
 1 3 5  1;
 1 3 6  4;
 2 3 5  0;
 2 0 0  0;
 3 1 2  3;
 3 3 3  3]


A = arrayfun(@(x) M(M(:,1) == x, :), unique(M(:,1)), 'uniformoutput', false)
Run Code Online (Sandbox Code Playgroud)

结果A是一个单元格数组,其内容可以按如下方式访问:

>> a{1}

ans =

     1     4    56     1
     1     3     5     1
     1     3     6     4

>> a{2}

ans =

     2     3     5     0
     2     0     0     0

>> a{3}

ans =

     3     1     2     3
     3     3     3     3
Run Code Online (Sandbox Code Playgroud)

要在第一列中基于yyyymmdd格式拆分数据,可以使用以下命令:

yearly = arrayfun(@(x) M(floor(M(:,1)/10000) == x, :), unique(floor(M(:,1)/10000)), 'uniformoutput', false)

monthly = arrayfun(@(x) M(floor(M(:,1)/100) == x, :), unique(floor(M(:,1)/100)), 'uniformoutput', false)
Run Code Online (Sandbox Code Playgroud)