我想对矩阵A的列进行分组,这些列在Matlab中的第三行具有相同的值
对于矩阵a(4行,1000列)。我想对矩阵A中第三行具有相同值的列进行分组。所以我必须有第三行包含相同值的子矩阵 例如: 如果: 然后 结果可以是一个单元格的形式。这里有一个可能的黑客攻击(警告:我无法检查):我想对矩阵A的列进行分组,这些列在Matlab中的第三行具有相同的值,matlab,Matlab,对于矩阵a(4行,1000列)。我想对矩阵A中第三行具有相同值的列进行分组。所以我必须有第三行包含相同值的子矩阵 例如: 如果: 然后 结果可以是一个单元格的形式。这里有一个可能的黑客攻击(警告:我无法检查): 在您显示的示例中,第3行中有4个唯一元素,因此您应该获得4个子矩阵,但仅显示3 这里有一个方法: clear all; %data A = [1 4 5 2 2 2 2 1 1 5; 1 4
在您显示的示例中,第3行中有4个唯一元素,因此您应该获得4个子矩阵,但仅显示3 这里有一个方法:
clear all;
%data
A = [1 4 5 2 2 2 2 1 1 5;
1 4 5 4 4 2 2 4 5 2;
3 3 3 3 4 1 3 5 3 4;
4 5 5 5 4 1 5 5 5 5
]
%engine
row = 3;
b = unique(A(row,:));
r = arrayfun(@(i) A(:,A(row,:)==b(i)),1:length(b), 'UniformOutput',false);
r{:}
您可以使用以下命令在单行中进行分配: 这样,
out{i}
包含A
的所有列,其中A
的第三行等于i
(如果没有有效列,则为空)
如果希望out{i}
包含与A
第三行中第i个最小唯一值对应的列,可以首先从统计工具箱使用:
[idx,correspondingEntryInA] = grp2idx(A(3,:)'); %'#
out = accumarray(idx, (1:size(A,2)), [], @(x){A(:,x)} );
这里,out{i}
包含与correspondingtryina(i)
相对应的列。它不会完全满足你的要求,但它会让你走上一段路。
A =
1 4 5 2 2 2 2 1 1 5
1 4 5 4 4 2 2 4 5 2
3 3 3 3 4 1 3 5 3 4
4 5 5 5 4 1 5 5 5 5
specialRow=3;
unqCols = unique(A(specialRow,:));
numUnq = length(unqCols);
sepMats{numUnq}=[];
for i=1:numUnq
sepMats{i} = A(:,A(specialRow,:)==unqCols(i));
end
clear all;
%data
A = [1 4 5 2 2 2 2 1 1 5;
1 4 5 4 4 2 2 4 5 2;
3 3 3 3 4 1 3 5 3 4;
4 5 5 5 4 1 5 5 5 5
]
%engine
row = 3;
b = unique(A(row,:));
r = arrayfun(@(i) A(:,A(row,:)==b(i)),1:length(b), 'UniformOutput',false);
r{:}
A = [1 4 5 2 2 2 2 1 1 5;
1 4 5 4 4 2 2 4 5 2;
3 3 3 3 4 1 3 5 3 4;
4 5 5 5 4 1 5 5 5 5
];
out = accumarray(A(3,:)', (1:size(A,2)), [], @(x){A(:,x)} );
[idx,correspondingEntryInA] = grp2idx(A(3,:)'); %'#
out = accumarray(idx, (1:size(A,2)), [], @(x){A(:,x)} );