Fortran 定义unique函数删除数组中的重复数值

此函数和matlab中的[c,ia,ic] = unique(arr)是一致的,只能满足一维数组,二维数组其实就是加个循环即可。

    subroutine unique(arr,C,ia,ic,count,n)
    implicit none
    integer :: n
    integer :: arr(n)
    integer :: C(n), ia(n), ic(n)
    integer :: i, j, k, count, temp

    count = 0
    do i = 1, n
        C(i) = 0
        ic(i) = 0
    end do

    do i = 1, n
        do j = 1, count
            if (arr(i) == C(j)) then
                ic(i) = j
                exit
            end if
        end do

        if (ic(i) == 0) then
            count = count + 1
            C(count) = arr(i)
            ic(i) = count
        end if
    end do

    ! 排序结果数组 C
    do i = 1, count-1
        do j = 1, count-i
            if (C(j) > C(j+1)) then
                temp = C(j)
                C(j) = C(j+1)
                C(j+1) = temp

                ! 更新 ic 数组
                do k = 1, n
                    if (ic(k) == j) then
                        ic(k) = j+1
                    else if (ic(k) == j+1) then
                        ic(k) = j
                    end if
                end do
            end if
        end do
    end do

    ! 初始化 ia 数组
    do i = 1, n
        ia(i) = i
    end do
    end subroutine unique

参数说明:

arr:要算的函数

C:unique后的数组,和arr一样长,需要count函数来获取,C(1:count)所有的不重复数值

ia:arr(ia)=C

ic:C(ic) = arr

count:不重复数值的个数

n:arr的大小

检验后和matlab的unique函数应该是一致的。

你可能感兴趣的:(算法)