Fortran Coder

查看: 11783|回复: 3
打印 上一主题 下一主题

[数值问题] 如何对多维数组进行排序并输出其位置指针

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
10 点
跳转到指定楼层
楼主
发表于 2021-5-19 16:34:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何在Fortran中对多维数组进行排序,并列出排序后数组元素在原数组的位置?即实现类似MATLAB中sort函数功能。
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2

帖子

0

主题

0

精华

新人

F 币
13 元
贡献
5 点
沙发
发表于 2021-6-9 01:42:13 | 只看该作者
本帖最后由 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

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

2

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
10 点
板凳
 楼主| 发表于 2021-6-23 10:18:52 | 只看该作者
非常感谢您的回答。

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

地板
发表于 2021-6-24 08:21:37 | 只看该作者
SolaProject 发表于 2021-6-9 01:42
如果只是要求输出位置,而非指向其地址的索引,创建一个和排序数组结构大小相同的数组,然后按照单个排序的 ...

用Fortran自带的函数MINLOC可以简化一下。
intel的fortran带了自己的排序函数。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 23:14

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表