Arrays 在Matlab中,相对于最后一列对除最后一个元素之外的相等行进行排序
我对Matlab中的一段代码有一个问题。假设我们有一个矩阵Arrays 在Matlab中,相对于最后一列对除最后一个元素之外的相等行进行排序,arrays,matlab,sorting,matrix,Arrays,Matlab,Sorting,Matrix,我对Matlab中的一段代码有一个问题。假设我们有一个矩阵 mx4维度的A A=[ 2 3 4 |1 2 3 4 |0 1 1 1 |0 1 1 1 |1 9 1 0 |0 9 1 0 |0 9 1 0 |1] 我想按降序排列行的前三个元素与第四列相等的行。因此,我想 B=[ 2 3 4 |1 2 3 4 |0 1 1 1 |1 1 1 1 |0 9 1 0 |1 9 1 0 |0
mx4维度的A
A=[ 2 3 4 |1
2 3 4 |0
1 1 1 |0
1 1 1 |1
9 1 0 |0
9 1 0 |0
9 1 0 |1]
我想按降序排列行的前三个元素与第四列相等的行。因此,我想
B=[ 2 3 4 |1
2 3 4 |0
1 1 1 |1
1 1 1 |0
9 1 0 |1
9 1 0 |0
9 1 0 |0]
实现这一点的一种方法是创建一个mx2矩阵,您可以使用sortrows
进行排序sortrows
对第一列进行排序,然后使用第二列解决任何关系。第一列是一个索引,用于表示A
的前三列的唯一组合
对于示例数据,第一列如下所示
[~, ~, inds] = unique(A(:,1:3), 'rows', 'stable');
inds =
1
1
2
2
3
3
3
然后,第二列是要排序的列(第四列)
现在我们想在这个问题上使用sortrows
,并对第一列按升序排序,第二列按降序排序
sorted = sortrows(cat(2, inds, A(:,4)), [1 -2])
1 1
1 0
2 1
2 0
3 1
3 0
3 0
第二列对应于您在B
中显示的所需第四列。因此,让我们简单地将其与A
的前三列连接起来,以创建B
B = cat(2, A(:,1:3), sorted(:,2))
2 3 4 1
2 3 4 0
1 1 1 1
1 1 1 0
9 1 0 1
9 1 0 0
9 1 0 0
总结
因此,综合这些,我们得到以下结果
[~, ~, inds] = unique(A(:,1:3), 'rows', 'stable');
sorted = sortrows(cat(2, inds, A(:,4)), [1 -2]);
B = cat(2, A(:,1:3), sorted(:,2));
Se使用splitapplay
(在R2015b中介绍)采用类似的方法
我想的是,如果行是相等的,那么第四列w.r.t对它们重新排序有什么好处?就像你想用它做什么一样?一旦它们被重新排序,我只想用“unique”@user3285148保留第一次重复,如果这是你的最终目标,为什么不使用unique(一个“行”)
?unique保持第一个相等的行我觉得这对于你手头的更大问题来说是一种过分的做法。请解释你正在努力实现的目标,可能有直接的方法来实现。复杂或复杂的代码容易出现bug。
[~, ~, inds] = unique(A(:,1:3), 'rows', 'stable');
sorted = sortrows(cat(2, inds, A(:,4)), [1 -2]);
B = cat(2, A(:,1:3), sorted(:,2));
A=[ 2 3 4 1
2 3 4 0
1 1 1 0
1 1 1 1
9 1 0 0
9 1 0 0
9 1 0 1];
% Map first 3 columns to a single value
aux = str2num(strcat(num2str(A(:,1)),num2str(A(:,2)),num2str(A(:,3))));
% Find groups
G = sort(findgroups(aux));
% Sort groups of same value in descending order with respect to column 4
sorted = splitapply(@(x,y) {[dec2base(x,10)-'0',sort(y,'descend')]}, aux, A(:,4), G );
sorted = cell2mat(sorted)
sorted =
2 3 4 1
2 3 4 0
1 1 1 1
1 1 1 0
9 1 0 1
9 1 0 0
9 1 0 0