Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Matlab中,相对于最后一列对除最后一个元素之外的相等行进行排序_Arrays_Matlab_Sorting_Matrix - Fatal编程技术网

Arrays 在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

我对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
     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