我需要按照升序/降序排序矩陣的行。在MATLAB我可以做很容易如下:在FORTRAN中按行排序數組
A=[3 1 0;2 1 9;0 4 8]
sortrows(A,1)
所以它會「1」列中的行和其他列進行排序也會相應跟進。但我需要在FORTRAN中做到這一點。我對FORTRAN並不是很熟悉。任何人都可以告訴我如何在FORTRAN中做到這一點。謝謝。
我需要按照升序/降序排序矩陣的行。在MATLAB我可以做很容易如下:在FORTRAN中按行排序數組
A=[3 1 0;2 1 9;0 4 8]
sortrows(A,1)
所以它會「1」列中的行和其他列進行排序也會相應跟進。但我需要在FORTRAN中做到這一點。我對FORTRAN並不是很熟悉。任何人都可以告訴我如何在FORTRAN中做到這一點。謝謝。
雖然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
爲什麼「dim = 1」被附加在minloc()中,請參閱http://stackoverflow.com/questions/20670002/using-minloc-with-fortran-incompatible-ranks-0-and-1-in-assignment並且還要注意,minloc()總是返回給定數組節的索引從1開始(因此由上面的irow-1移位)。 – roygvib
有Fortran中沒有排序的內在。你需要編寫你自己的實現。對不起......不過。在野外有幾種現成可用的例程可用;-) –
對於可以從C標準庫調用'qsort'的列。對於行來說它會很棘手。 –