Fortran Coder

标题: 如何对多维数组进行排序并输出其位置指针 [打印本页]

作者: 科研农民工    时间: 2021-5-19 16:34
标题: 如何对多维数组进行排序并输出其位置指针
如何在Fortran中对多维数组进行排序,并列出排序后数组元素在原数组的位置?即实现类似MATLAB中sort函数功能。

作者: SolaProject    时间: 2021-6-9 01:42
本帖最后由 SolaProject 于 2021-6-9 01:44 编辑

如果只是要求输出位置,而非指向其地址的索引,创建一个和排序数组结构大小相同的数组,然后按照单个排序的维度进行从1到n的递增赋值,对原数组排序的同时,对新创建的数组执行相同的操作即可,如下:
[Fortran] 纯文本查看 复制代码
program example
    implicit none
    integer, dimension(2, 3) :: a=reshape((/4, 9, 6, 7, 5, 3/), (/2, 3/))
    integer, dimension(:, :), allocatable :: aLoc
    integer :: temp
    integer :: minLoc
    integer :: errorLevel
    integer :: i, j, k
    allocate(aLoc, source=a, stat=errorLevel)
    if ( errorLevel /= 0 ) stop ""
    do i = 1, size(a, 1)
        do j = 1, size(a, 2)
            aLoc(i, j) = j
        end do
    end do
    write(*, '(A,/(I1, ",", I1, ",", I1))') '输入矩阵:', ((a(i, j), j = 1, size(a, 2)), i = 1, size(a, 1))
    write(*, '(A,/(I1, ",", I1, ",", I1))') '序号矩阵:', ((aLoc(i, j), j = 1, size(a, 2)), i = 1, size(a, 1))
    do i = 1, size(a, 1)
        do j = 1, size(a, 2)
            minLoc = j
            do k = j+1, size(a, 2)
                if ( a(i, minLoc) > a(i, k) ) then
                    minLoc = k
                end if
            end do
            if ( k /= j ) then
                temp = a(i, minLoc)
                a(i, minLoc) = a(i, j)
                a(i, j) = temp
                temp = aLoc(i, minLoc)
                aLoc(i, minLoc) = aLoc(i, j)
                aLoc(i, j) = temp
            end if
        end do
    end do
    write(*, '(A,/(I1, ",", I1, ",", I1))') '输入矩阵按行排序后:', ((a(i, j), j = 1, size(a, 2)), i = 1, size(a, 1))
    write(*, '(A,/(I1, ",", I1, ",", I1))') '序号矩阵排序对应值:', ((aLoc(i, j), j = 1, size(a, 2)), i = 1, size(a, 1))
    deallocate(aLoc, stat=errorLevel)
    if ( errorLevel /= 0 ) stop ""
end program example
输出结果:
输入矩阵:
4,6,5
9,7,3
序号矩阵:
1,2,3
1,2,3
输入矩阵按行排序后:
4,5,6
3,7,9
序号矩阵排序对应值:
1,3,2
3,2,1

如果需要指向地址的索引,创建一个包含指针的派生数据类型数组,然后执行类似操作即可。

作者: 科研农民工    时间: 2021-6-23 10:18
非常感谢您的回答。
作者: necrohan    时间: 2021-6-24 08:21
SolaProject 发表于 2021-6-9 01:42
如果只是要求输出位置,而非指向其地址的索引,创建一个和排序数组结构大小相同的数组,然后按照单个排序的 ...

用Fortran自带的函数MINLOC可以简化一下。
intel的fortran带了自己的排序函数。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2