0

输入矩阵:

    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
4

2 回答 2

2

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

unique 的第三个输出将给出 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
于 2014-05-30T21:04:16.127 回答
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

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

于 2014-05-30T20:58:01.453 回答