A = [1,4,2,5,10
2,4,5,6,2
2,1,5,6,10
2,3,5,4,2]
我希望在最后一栏将其分成两个矩阵 A - > B和C
B = [1,4,2,5,10
2,1,5,6,10]
C = [2,4,5,6,2
2,3,5,4,2]
此外,这种方法可以应用于一个大矩阵,如矩阵100 * 22,根据最后一列值通过matlab分为9组。
答案 0 :(得分:5)
B=A(A(:,end)==10,:);
C=A(A(:,end)==2,:);
返回
>> B
B =
1 4 2 5 10
2 1 5 6 10
>> C
C =
2 4 5 6 2
2 3 5 4 2
编辑:回复丹的评论这里是一般案例的延伸
e = unique(A(:,end));
B = cell(size(e));
for k = 1:numel(e)
B{k} = A(A(:,end)==e(k),:);
end
或更紧凑的方式
B=arrayfun(@(x) A(A(:,end)==x,:), unique(A(:,end)), 'UniformOutput', false);
所以
A =
1 4 2 5 10
2 4 5 6 2
2 1 5 6 10
2 3 5 4 2
0 3 1 4 9
1 3 4 5 1
1 0 4 5 9
1 2 4 3 1
你得到了单元格数组B
>> B{1}
ans =
1 3 4 5 1
1 2 4 3 1
>> B{2}
ans =
2 4 5 6 2
2 3 5 4 2
>> B{3}
ans =
0 3 1 4 9
1 0 4 5 9
>> B{4}
ans =
1 4 2 5 10
2 1 5 6 10
答案 1 :(得分:3)
这是一种通用方法,适用于任何大小矩阵的最后一列中的任意数量的数字:
A = [1,4,2,5,10
2,4,5,6,2
1,1,1,1,1
2,1,5,6,10
2,3,5,4,2
0,0,0,0,2];
首先按最后一栏排序(很多方法都这样做,不知道这是不是最好的)
[~, order] = sort(A(:,end));
As = A(order,:);
然后创建一个向量,显示相同数字的行数出现在最后一个列中(即每组有多少行)
rowDist = diff(find([1; diff(As(:, end)); 1]));
请注意,对于我的示例,数据rowDist
将等于[1 3 2]
,因为有1 1
,3 2
和2 10
s。
现在使用mat2cell
按这些行分组进行拆分:
Ac = mat2cell(As, rowDist);
如果您真的想要,现在可以将其拆分为单独的矩阵(但我怀疑您会这样做)
Ac{:}
结果
ans =
1 1 1 1 1
ans =
0 0 0 0 2
2 3 5 4 2
2 4 5 6 2
ans =
1 4 2 5 10
2 1 5 6 10
但我认为你会发现Ac
本身更有用
修改强>
许多解决方案也可以进行时间比较:
A = [...
1 4 2 5 10
2 4 5 6 2
2 1 5 6 10
2 3 5 4 2
0 3 1 4 9
1 3 4 5 3
1 0 4 5 9
1 2 4 3 1];
A = repmat(A, 1000, 1);
tic
for l = 1:100
[~, y] = sort(A(:,end));
As = A(y,:);
rowDist = diff(find([1; diff(As(:, end)); 1]));
Ac = mat2cell(As, rowDist);
end
toc
tic
for l = 1:100
D=arrayfun(@(x) A(A(:,end)==x,:), unique(A(:,end)), 'UniformOutput', false);
end
toc
tic
for l = 1:100
for k = 1:numel(e)
B{k} = A(A(:,end)==e(k),:);
end
end
toc
tic
for l = 1:100
Bb = sort(A(:,end));
[~,b] = histc(A(:,end), Bb([diff(Bb)>0;true]));
C = accumarray(b, (1:size(A,1))', [], @(r) {A(r,:)} );
end
toc
导致
Elapsed time is 0.053452 seconds.
Elapsed time is 0.17017 seconds.
Elapsed time is 0.004081 seconds.
Elapsed time is 0.22069 seconds.
因此,即使是大型矩阵,循环方法仍然是最快的。
答案 2 :(得分:1)
将accumarray
与histc
结合使用:
% Example data (from Mohsen Nosratinia)
A = [...
1 4 2 5 10
2 4 5 6 2
2 1 5 6 10
2 3 5 4 2
0 3 1 4 9
1 3 4 5 1
1 0 4 5 9
1 2 4 3 1];
% Get the proper indices to the specific rows
B = sort(A(:,end));
[~,b] = histc(A(:,end), B([diff(B)>0;true]));
% Collect all specific rows in their specific groups
C = accumarray(b, (1:size(A,1))', [], @(r) {A(r,:)} );
结果:
>> C{:}
ans =
1 3 4 5 1
1 2 4 3 1
ans =
2 3 5 4 2
2 4 5 6 2
ans =
0 3 1 4 9
1 0 4 5 9
ans =
2 1 5 6 10
1 4 2 5 10
请注意
B = sort(A(:,end));
[~,b] = histc(A(:,end), B([diff(B)>0;true]));
也可以写成
[~,b] = histc(A(:,end), unique(A(:,end)));
但是unique
不是内置的,因此可能会更慢,尤其是当它在循环中全部使用时。
另请注意,行的顺序已更改为w.r.t.他们在原始矩阵中的顺序。如果订单很重要,您将不得不投入另一个sort
:
C = accumarray(b, (1:size(A,1))', [], @(r) {A(sort(r),:)} );