加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

对数值矩阵的字典排序MATLAB实现

(2017-10-19 12:27:57)
分类: MATLAB
在数学和建模过程中,有时会遇到需要对一个数值矩阵,设为m*n型的A排序,这种排序无法通过调用MATLAB内部函数sort可以解决的。
下面详细解释字典排序的含义:假设有四组数据,每一组数据都5个数值,比如下面的initA
initA =

     5     4     6     7     8
     4     5     8     9     6
     4     4     8     9     6
     5     4     3     7     8
我们可以发现第一行(组)和第四行(组)的数值前两个都是一样的,第三个不一样了,而我们这个字典排序的做法是首先比较各行的第一个数值,更小的数值对应的行(或组)放在前面,比如这里的第一行和第二行比较,发现第一个数值5>4,所以第二行应该放在第一行前面;而第一行和第四行比较时,第一个数值相等,比较不出结果,接着比较第二个数值,还是一样,为此比较第三个数值发现6>3,因此第四行(或组)应该放在第一行的前面,依次类推。

至于函数的输入参数CompIndex的含义不再具体解释。详细理解参见代码及注释

代用代码和结果如下:
initA = [5 4 6 7 8;4 5 8 9 6;4 4 8 9 6;5 4 3 7 8];
A1 = SortDic(initA)

A1 =

     4     4     8     9     6
     4     5     8     9     6
     5     4     3     7     8
     5     4     6     7     8



function [A] = SortDic(initA,CompIndex)
% 根据CompIndex的指示对initA的每一行进行排序
% 首先比较第一列的值,没有结果才比较第二列的值,以此类推
% 如果CompIndex(ii) == 1表示按照从小到大比较(默认):取 < 号
% 如果CompIndex(ii) == -1表示按照从大到小比较:      取 > 号


if (nargin < 2) || (isempty(CompIndex)), CompIndex = ones(1,size(initA,2)); end
if (nargin < 1) || (isempty(initA)), error('Error:SortDic:输入需要排序的数值矩阵initA!'); end


A = initA;
[row,col] = size(A);

for ii = 1:(row - 1)
    pos = ii;
    for jj = (ii+1):row
        Index = Compare2Vec(A(pos,:),A(jj,:),CompIndex);
        if Index == -1
            pos = jj;
        end
    end
    if pos ~= ii
        t = A(ii,:);
        A(ii,:) = A(pos,:);
        A(pos,:) = t;
    end
end

% end of function SortDic


function Index = Compare2Vec(v1,v2,CompIndex)
% 比较两个数字向量的大小,按照CompIndex(ii)的值比较
% 如果CompIndex(ii) == 1表示按照从小到大比较(默认):取 < 号
% 如果CompIndex(ii) == -1表示按照从大到小比较:      取 > 号
% 返回 Index 的值,0表示相等或没有结果
% Index: 1表示v1在v2前面, -1表示v1在v2后面

if nargin < 3, CompIndex = ones(1,length(v1)); end
n = length(v1);

Index = 0;                        % 初始化为没有比较结果或相等结果
flag = 0;
for ii = 1:n
    if v1(ii) < v2(ii)            % 按照默认,说明v1在v2前面
        flag = ii;
        Index = 1; break;
    elseif v1(ii) > v2(ii)        % 按照默认,说明v1在v2默认
        flag = ii;
        Index = -1; break;
    end
end

if flag > 0
    if CompIndex(flag) == -1      % 不是默认比较方式
        Index = -1 * Index;
    end
else
    Index = 0;
end

%
% end of function Compare2Vec

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有