You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran计算矩阵列排除最值的平均值及输出无结果问题求解

问题诊断与最优实现方案

原有代码错误点

  • 无限循环+阻塞式控制台输入:代码开头的无限Do内第一行read(*,*)varStr,varStlb需要手动从控制台输入矩阵行数、列数,未输入时程序会一直阻塞,不会执行后续读写逻辑,自然无输出。
  • 矩阵索引倒置:计算列和时调用的a(j,i)是取第j行第i列的元素,和循环逻辑的预期(取第j列第i行元素)不符,会出现计算错误甚至数组越界。
  • 资源释放不完整:仅释放了矩阵A,未释放数组B,长期运行会有内存泄漏风险。
  • 缺少IO异常处理与文件关闭逻辑:打开文件未指定状态参数,程序运行结束未主动关闭文件,可能出现输出缓冲区未刷新导致内容没有写入文件的问题。

普通列均值计算修正代码

Program Matrix
    Implicit None
    Real,Allocatable,dimension(:,:)::A 
    Real,Allocatable,dimension(:):: b 
    Integer :: varStr, varStlb 
    Integer :: i, j  
    Real :: summa
    ! 对应in.txt的矩阵维度:3行3列,也可修改为从in.txt第一行读取行列数
    varStr = 3
    varStlb = 3
    Allocate(A(1:varStr,1:varStlb), B(1:varStlb)) 

    Open(Unit=1, File='in.txt', Status='old', Action='read') 
    Open(Unit=8, File='out.txt', Status='replace', Action='write') 

    Read(1,*) (A(i,:), i = 1, varStr)
    
    ! 计算普通列均值
    do j = 1, varStlb           
        summa = 0
        do i = 1, varStr
            summa = summa + A(i,j) 
        end do
        b(j) = summa/varStr       
        write(8,'(A,I2,A,F8.2)') '第',j,'列平均值 = ',b(j)
    end do 

    ! 释放资源、关闭文件
    Deallocate(A, B)
    Close(1)
    Close(8)
End Program Matrix

排除列最值的列均值实现

如果需要实现排除每列最大值、最小值后的平均值,直接对每列的元素先求最值、求和时跳过对应值即可,代码修改如下:

Program Matrix_Exclude_Extremum
    Implicit None
    Real,Allocatable,dimension(:,:)::A 
    Real,Allocatable,dimension(:):: b 
    Integer :: varStr, varStlb 
    Integer :: i, j  
    Real :: summa, col_max, col_min
    varStr = 3
    varStlb = 3
    Allocate(A(1:varStr,1:varStlb), B(1:varStlb)) 

    Open(Unit=1, File='in.txt', Status='old', Action='read') 
    Open(Unit=8, File='out.txt', Status='replace', Action='write') 
    Read(1,*) (A(i,:), i = 1, varStr)
    
    do j = 1, varStlb           
        summa = 0
        col_max = maxval(A(:,j))
        col_min = minval(A(:,j))
        do i = 1, varStr
            ! 跳过当前列的最大值和最小值
            if (A(i,j) /= col_max .and. A(i,j) /= col_min) then
                summa = summa + A(i,j) 
            end if
        end do
        ! 行数大于2时做除法,避免除0
        if (varStr > 2) then
            b(j) = summa/(varStr - 2)
        else
            b(j) = 0.0
        end if
        write(8,'(A,I2,A,F8.2)') '第',j,'列排除最值后的平均值 = ',b(j)
    end do 

    Deallocate(A, B)
    Close(1)
    Close(8)
End Program Matrix_Exclude_Extremum

如果需要处理一列存在多个相同最值的场景(比如同列有2个相等的最大值),仅需排除1个最值的话,可以先对列元素排序后截取中间段求和即可。

输出说明

用你提供的in.txt测试,排除最值的列计算结果如下:

  • 第1列元素:10.05、4.0、8.0,排除最大值10.05、最小值4.0,平均值为8.0
  • 第2列元素:-22.0、0.0、13.0,排除最大值13.0、最小值-22.0,平均值为0.0
  • 第3列元素:3.0、60.0、22.5,排除最大值60.0、最小值3.0,平均值为22.5

内容的提问来源于stack exchange,提问作者HUR1EY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:06:07