2016-02-10 66 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