用MATLAB求解一个简单的排序问题

ac1kyiln  于 2022-12-13  发布在  Matlab
关注(0)|答案(1)|浏览(137)

我在一门MATLAB课程中遇到过这个问题,老师给出的解决方案是错误的,我已经为同样的问题挣扎了好几个小时,因为我是一个刚开始编码的初学者(这里是一个理科学生)。
考虑一维矩阵A,如A = \[5 8 8 8 9 9 6 6 5 5 4 1 2 3 5 3 3 \]。按降序显示矩阵A中唯一元素的百分比频率。
提示:使用函数tabulatesort
如何仅使用制表、排序和查找函数来解决此问题(查找函数用于消除制表表中的零频率元素,我的教师没有这样做)?
我首先尝试使用find函数提取制表表的百分比列中的非零元素的索引,我使用以下代码成功地做到了这一点:

A = [5 8 8 8 9 9 6 6 5 5 4 1 2 3 5 3 3 ];
B = tabulate(A);
C = find(B(:,3) > 0)

但是我现在很难使用C中的索引返回对应于B的第3列的值。请帮助我。也请给予我一些替代的语法,人们可以很容易地从一行或一列的非零元素中创建一个向量,如果它存在的话,通过省略该向量中的零来实现。其余的问题我会自己做。

nzk0hqpo

nzk0hqpo1#

使用find命令,您只是查找矩阵的索引,而不是值本身。
所以你要么这样做:

A = [5 8 8 8 9 9 6 6 5 5 4 1 2 3 5 3 3 ];
B = tabulate(A);

for i = 1:size(B,1)-1
    if B(i,3) == 0
        B(i,:) = [];
    end
end

sortrows(B,3,'descend')

在其中删除0值所在的行。
或者,因为你有所有频率为非零的数字,你可以求出它们所在的行,比如:

A = [5 8 8 8 9 9 6 6 5 5 4 1 2 3 5 3 3 ];
B = tabulate(A);
C = find(B(:,3) > 0); 
sortrows(B(C(:),:),3,'descend')

B(C(:),:)将所有具有第一索引的行称为矩阵C的索引。这正是您所要求的。同时,您将基于行3以降序对矩阵进行排序。

相关问题