2016-02-10 39 views
1

我需要按照升序/降序排序矩阵的行。在MATLAB我可以做很容易如下:在FORTRAN中按行排序数组

A=[3 1 0;2 1 9;0 4 8] 
sortrows(A,1) 

所以它会“1”列中的行和其他列进行排序也会相应跟进。但我需要在FORTRAN中做到这一点。我对FORTRAN并不是很熟悉。任何人都可以告诉我如何在FORTRAN中做到这一点。谢谢。

+1

有Fortran中没有排序的内在。你需要编写你自己的实现。对不起......不过。在野外有几种现成可用的例程可用;-) –

+0

对于可以从C标准库调用'qsort'的列。对于行来说它会很棘手。 –

回答

5

虽然Fortran语言没有排序内部函数,代码可能会变成,如果您使用minloc功能简单一点找到在第一列中的最小元素,并与当前的交换相应的行重复,例如:

program main 
    implicit none 
    integer :: A(3,3), buf(3) 
    integer :: nsize, irow, krow 

    nsize = 3 
    A(1, :) = [ 3, 1, 0 ] 
    A(2, :) = [ 2, 1, 9 ] 
    A(3, :) = [ 0, 4, 8 ] 

    do irow = 1, nsize 
     krow = minloc(A(irow:nsize, 1), dim=1) + irow - 1 

     buf(:)  = A(irow, :) 
     A(irow, :) = A(krow, :) 
     A(krow, :) = buf(:) 
    enddo 
end 

这给

A(1, :) = 0 4 8 
A(2, :) = 2 1 9 
A(3, :) = 3 1 0 
+0

为什么“dim = 1”被附加在minloc()中,请参阅http://stackoverflow.com/questions/20670002/using-minloc-with-fortran-incompatible-ranks-0-and-1-in-assignment并且还要注意,minloc()总是返回给定数组节的索引从1开始(因此由上面的irow-1移位)。 – roygvib