根据matlab中的对角线值,按升序排列矩阵的对角线值,而不是对角线值

时间:2014-05-30 20:15:41

标签: matlab sorting matrix bsxfun

输入矩阵:

    1.0000         0    0.2173    0.2585    0.3764
         0         0         0         0         0
    0.2173         0    0.2173    0.2173    0.2173
    0.2585         0    0.2173    0.2585    0.2585
    0.3764         0    0.2173    0.2585    0.3764

预期输出矩阵:

       5    1    2    3    4
       1    1    1    1    1
       2    1    2    2    2
       3    1    2    3    3
       4    1    2    3    4

对于给定的矩阵R = {r(i,j)}以下是为输入矩阵完成的2个操作:

1.我们按升序排列对角线值(即给出小值等级1和下一个小值等级2等等)

 ex:
     0-1st rank
0.2173-2nd rank
0.2585-3rd rank
0.3764-4th rank
1.0000-5th rank

2.除了对角线单元格外,我们根据对角线值对休息值进行排序(即对角线值等级给予其他矩阵值)

    ex:For 1st row           For 2nd row       For 3rd row      For 4th row     For 5th row


      0-1st rank             0-1st rank         0-1st rank          0-1st rank        0-1st rank 
 0.2173-2nd rank             0-1st rank    0.2173-2nd rank     0.2173-2nd rank   0.2173-2nd rank
 0.2585-3rd rank             0-1st rank    0.2173-2nd rank     0.2585-3rd rank   0.2585-3rd rank
 0.3764-4th rank             0-1st rank    0.2173-2nd rank     0.2585-3rd rank   0.3764-4th rank

我试过的源代码:

 out = zeros(size(table1));


for k = 1:5
    [~,ind2] = sort(table1(k,:));

    ind2(ind2)=1:5;
    out(k,:) = ind2;

end


out = out-bsxfun(@gt,out,diag(out));

%%// Take care of assigning diagonal elements
[~,ind1] = sort(diag(table1));
ind1(ind1)=1:5;
out(1:size(out,1)+1:end)=ind1;

C=out

我得到的输出矩阵:

 5     1     2     3     4
 1     1     2     3     4
 2     1     2     3     4
 3     1     2     3     4
 4     1     2     3     4

2 个答案:

答案 0 :(得分:2)

假设对角线中存在所有值...您需要做的就是用正整数替换所有值,同时保持数字的排序......

唯一的第三个输出将给出A中所有值的列向量,但将最低值替换为1,将第二个最低值替换为2,依此类推...然后可以将其重新整形为大小为A的矩阵

代码

[~,~,temp]=unique(A);
out=reshape(temp,size(A))

结果

out =

     5     1     2     3     4
     1     1     1     1     1
     2     1     2     2     2
     3     1     2     3     3
     4     1     2     3     4

答案 1 :(得分:0)

在我看来,排序不会合并重复值。您可能需要在for循环中添加一些内容,以确保相同的值具有相同的索引。也许类似于以下内容:

for k = 1:5
  [val,ind2] = sort(table1(k,:));
  [uval, uvi] = unique(val); 
  ind2b = ind2; 
  for ki = 1:length(uval)
    ind2b(val == uval(ki)) = ki;
  end
  out(k,:) = ind2b;
end

我上面发布的代码片段在每行中找到了一组唯一值,然后为每个值组分配一个索引。