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
相关产品推荐
相关产品推荐

