查找匹配多个条件之一的数组元素,按条件匹配排序
find array elements that match one of multiple conditions, sorted by condition matched
我有一个 m×n 矩阵 (n > 3),其中前两列有很多重复值。我还有另外两个向量,称它们为 uniqueCol1
和 uniqueCol2
,它们包含两列的所有可能值。
我想找到所有子矩阵,它们将是 p×n (p =< m),其中前两列与 uniqueCol1
和 uniqueCol2
中的给定值匹配.最多有length(uniqueCol1) * length(uniqueCol2)
个这样的子矩阵。
我可以使用 ismember()
来帮助找到这些子矩阵,但我看不到这样做的方法,我可以知道输出的哪些部分匹配什么条件。
或者我可以做一个 for 循环,如下所示,但这非常慢。有没有办法对下面的内容进行矢量化?我想该解决方案会将这些子矩阵的元胞数组作为输出,因为每个子矩阵的大小通常不同(因此多维数组不起作用)。
myBigMatrix = round(wgn(1000,6,1) * 3);
uniqueCol1 = unique(myBigMatrix(:,1));
uniqueCol2 = unique(myBigMatrix(:,2));
for i = 1:length(uniqueCol1)
for j = 1:length(uniqueCol2)
mySubMatrix = myBigMatrix( ...
myBigMatrix(:,1) == uniqueCol1(i) & ...
myBigMatrix(:,2) == uniqueCol2(j) , :);
% then do something with mySubMatrix,
% as it's clear from i and j what condition it matched
end
end
您可以使用强大的 accumarray
功能完成此任务:
[uniqueCol1, ~, u1] = unique(myBigMatrix(:,1));
[uniqueCol2, ~, u2] = unique(myBigMatrix(:,2));
R = accumarray([u1 u2], (1:size(myBigMatrix,1)).', [], @(x) {myBigMatrix(sort(x),:)})
则R{m,n}
包含匹配uniqueCol1
的第m
个元素和uniqueCol2
的第n
个元素的子矩阵。
示例:
myBigMatrix =
3 5 3
3 2 2
3 5 1
3 2 1
1 5 4
4 3 4
给予
>> uniqueCol1.'
ans =
1 3 4
>> uniqueCol2.'
ans =
2 3 5
>> R
R =
[] [] [1x3 double]
[2x3 double] [] [2x3 double]
[] [1x3 double] []
>> R{2,1} %// submatrix corresponding to 3 in first col and 2 in second col
ans =
3 2 2
3 2 1
>> R{3,2} %// submatrix corresponding to 4 in first col and 3 in second col
ans =
4 3 4
我有一个 m×n 矩阵 (n > 3),其中前两列有很多重复值。我还有另外两个向量,称它们为 uniqueCol1
和 uniqueCol2
,它们包含两列的所有可能值。
我想找到所有子矩阵,它们将是 p×n (p =< m),其中前两列与 uniqueCol1
和 uniqueCol2
中的给定值匹配.最多有length(uniqueCol1) * length(uniqueCol2)
个这样的子矩阵。
我可以使用 ismember()
来帮助找到这些子矩阵,但我看不到这样做的方法,我可以知道输出的哪些部分匹配什么条件。
或者我可以做一个 for 循环,如下所示,但这非常慢。有没有办法对下面的内容进行矢量化?我想该解决方案会将这些子矩阵的元胞数组作为输出,因为每个子矩阵的大小通常不同(因此多维数组不起作用)。
myBigMatrix = round(wgn(1000,6,1) * 3);
uniqueCol1 = unique(myBigMatrix(:,1));
uniqueCol2 = unique(myBigMatrix(:,2));
for i = 1:length(uniqueCol1)
for j = 1:length(uniqueCol2)
mySubMatrix = myBigMatrix( ...
myBigMatrix(:,1) == uniqueCol1(i) & ...
myBigMatrix(:,2) == uniqueCol2(j) , :);
% then do something with mySubMatrix,
% as it's clear from i and j what condition it matched
end
end
您可以使用强大的 accumarray
功能完成此任务:
[uniqueCol1, ~, u1] = unique(myBigMatrix(:,1));
[uniqueCol2, ~, u2] = unique(myBigMatrix(:,2));
R = accumarray([u1 u2], (1:size(myBigMatrix,1)).', [], @(x) {myBigMatrix(sort(x),:)})
则R{m,n}
包含匹配uniqueCol1
的第m
个元素和uniqueCol2
的第n
个元素的子矩阵。
示例:
myBigMatrix =
3 5 3
3 2 2
3 5 1
3 2 1
1 5 4
4 3 4
给予
>> uniqueCol1.'
ans =
1 3 4
>> uniqueCol2.'
ans =
2 3 5
>> R
R =
[] [] [1x3 double]
[2x3 double] [] [2x3 double]
[] [1x3 double] []
>> R{2,1} %// submatrix corresponding to 3 in first col and 2 in second col
ans =
3 2 2
3 2 1
>> R{3,2} %// submatrix corresponding to 4 in first col and 3 in second col
ans =
4 3 4