2016-02-10 4 views
1

Мне нужно отсортировать строки матрицы в порядке возрастания/убывания. В MATLAB можно сделать довольно легко следующим образом:сортировка массивов по строкам в FORTRAN

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

так будет сортировать строки в колонке «1» и другие столбцы будут следовать соответствующим образом. Но мне нужно сделать это в ФОРТРАНЕ. И я не очень хорошо знаком с FORTRAN. Может кто-нибудь посоветует мне, как это сделать в FORTRAN. Благодарю.

+1

Там нет сортировки присущий в Fortran. Вам нужно будет написать свою собственную реализацию. Извини ... Однако. есть несколько готовых к использованию рутин, доступных там в дикой природе ;-) –

+0

Для столбцов вы можете называть 'qsort' из стандартной библиотеки C. Для строк это было бы сложно. –

ответ

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

Смежные вопросы