问题描述:已知矩阵G,NXK维,获得矩阵G每一列的元素的秩。此处秩的定义是:将一个数组排序后(按升序或降序),数组中的元素在排完序的数组中的序号。实现平台:Matlab
首先,编写获得一个数组的秩的函数。如下
输入:vector-----数组或向量
输出:OrderVector----由每个元素的秩所组成的数组
下面调用上面的函数,获得G每一列的顺序数组
function OrderVector= Order_Vector(vector)
array=sort(vector,'ascend'); % 获得排序后的数组
OrderVector=zeros(length(vector),1);
for i=1:length(vector)
temp=find(array==vector(i)); %find()函数,找寻元素在排序后的数组中的位置,有可能不止一个,因为可能有重复的元素
if length(temp)~=1 %若有重复的元素
OrderVector(i)=temp(1); %重复元素的赋予相同的秩
else
OrderVector(i)=temp;
end
end
array=sort(vector,'ascend'); % 获得排序后的数组
OrderVector=zeros(length(vector),1);
for i=1:length(vector)
temp=find(array==vector(i)); %find()函数,找寻元素在排序后的数组中的位置,有可能不止一个,因为可能有重复的元素
if length(temp)~=1 %若有重复的元素
OrderVector(i)=temp(1); %重复元素的赋予相同的秩
else
OrderVector(i)=temp;
end
end
end
下面调用上面的函数,获得G每一列的顺序数组
for i=1:K
L(:,i)=Order_Vector(G(:,i));
%下面对顺序数组进行修正,因为里面有重复的秩
x=L(:,i);
array=sort(L(:,i),'ascend'); % 获得排序后的数组
for j=1:N
temp=find(x==array(j)); %find()函数,找寻元素在排序后的数组中的位置,有可能不止一个,因为可能有重复的元素
if length(temp)~=1 %若有重复的秩
x(temp(1))=array(j); %重复的秩中第一个不变
for k=2:length(temp) %重复的秩中第一个不变,后面的秩加1
x(temp(k))=array(j)+1;
end
end
end
L(:,i)=x; %对顺序矩阵的每一列进行更新
end
x=L(:,i);
array=sort(L(:,i),'ascend'); % 获得排序后的数组
for j=1:N
temp=find(x==array(j)); %find()函数,找寻元素在排序后的数组中的位置,有可能不止一个,因为可能有重复的元素
if length(temp)~=1 %若有重复的秩
x(temp(1))=array(j); %重复的秩中第一个不变
for k=2:length(temp) %重复的秩中第一个不变,后面的秩加1
x(temp(k))=array(j)+1;
end
end
end
L(:,i)=x; %对顺序矩阵的每一列进行更新
end
其实,上面的两部分可以合起来,写成一个函数。如果矩阵中没有重复元素,上面的函数可以获得其顺序矩阵。如果有重复元素,下面那段程序是对获取的顺序矩阵的后续处理。
获得顺序矩阵的关键是:如果矩阵中没有重复元素的话,比较好操作。如果,有重复元素,需要对重复元素的秩进行处理。