我需要按照升序/降序排序矩阵的行。在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'的列。对于行来说它会很棘手。 –