输入矩阵:
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
答案 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
我上面发布的代码片段在每行中找到了一组唯一值,然后为每个值组分配一个索引。