使用自定义函数重新排列/排序矩阵

时间:2014-09-15 18:18:42

标签: matlab octave

如何使用自定义函数对矩阵进行排序/重新排列?

即。如果我有这样的数据:

data = rand(5)
data =
   0.9705954   0.9280535   0.1763516   0.0024225   0.8622087
   0.4187847   0.3452783   0.7068682   0.9295234   0.0906835
   0.3371114   0.4808020   0.8806709   0.9573226   0.5422291
   0.6477601   0.5711606   0.1111401   0.3909264   0.3565683
   0.0086004   0.8695550   0.7431095   0.8492812   0.6675760

我想按最后一行的值除以第一行的值来排序/重新排列矩阵列。我无法弄清楚如何以一种很好的方式做到这一点。到目前为止,我发现的唯一方法是这个丑陋的黑客:

tmp = [data(end,:) ./ data(1,:); data]
tmp =
   8.8610e-03   9.3697e-01   4.2138e+00   3.5059e+02   7.7426e-01
   9.7060e-01   9.2805e-01   1.7635e-01   2.4225e-03   8.6221e-01
   4.1878e-01   3.4528e-01   7.0687e-01   9.2952e-01   9.0683e-02
   3.3711e-01   4.8080e-01   8.8067e-01   9.5732e-01   5.4223e-01
   6.4776e-01   5.7116e-01   1.1114e-01   3.9093e-01   3.5657e-01
   8.6004e-03   8.6955e-01   7.4311e-01   8.4928e-01   6.6758e-01

tmp = sortrows(tmp')'
tmp =
   8.8610e-03   7.7426e-01   9.3697e-01   4.2138e+00   3.5059e+02
   9.7060e-01   8.6221e-01   9.2805e-01   1.7635e-01   2.4225e-03
   4.1878e-01   9.0683e-02   3.4528e-01   7.0687e-01   9.2952e-01
   3.3711e-01   5.4223e-01   4.8080e-01   8.8067e-01   9.5732e-01
   6.4776e-01   3.5657e-01   5.7116e-01   1.1114e-01   3.9093e-01
   8.6004e-03   6.6758e-01   8.6955e-01   7.4311e-01   8.4928e-01

data = tmp(2:end,:)
data =
   0.9705954   0.8622087   0.9280535   0.1763516   0.0024225
   0.4187847   0.0906835   0.3452783   0.7068682   0.9295234
   0.3371114   0.5422291   0.4808020   0.8806709   0.9573226
   0.6477601   0.3565683   0.5711606   0.1111401   0.3909264
   0.0086004   0.6675760   0.8695550   0.7431095   0.8492812

对于大型矩阵,这很慢:(

1 个答案:

答案 0 :(得分:2)

使用sort的第二个输出来获取列索引:

[~, ind] = sort(data(end,:)./data(1,:))
result = data(:,ind);