我有一个矩阵,其形式如下:
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.数据集跨越了几年,我希望将这个数据集拆分为每年的矩阵,然后是每个月.
您可以使用它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)