首页 > 解决方案 > 如何在fortran上正确记录矩阵的最小值和最大值之间的平均值计数

问题描述

我试图编写一个程序来计算平均值而不考虑列的最小值和平均值,最好的方法是什么?首先,我想简单地将列的平均值输出到文件中,没有错误,但没有输出。

Program Matrix
 Implicit None
Real,Allocatable,dimension(:,:)::A 
Real,Allocatable,dimension(:):: b 
Integer varStr,varStlb 
Integer i, j  
real summa
Open(1,file='in.txt') 
Open(8,file='out.txt') 
Do 
read(*,*)varStr,varStlb
Allocate(A(1:varStr,1:varStlb),B(1:varStlb)) 
Read(1,*) ( A(i,:), i = 1,varStr )
do j = 1, varStlb           
   summa = 0
   do i = 1, varStr
     summa = summa + a(j,i) 
   end do
   b(j) = summa/varStr       
   write(8,'(A,F8.2,A)')'b = ',b(j), ' - сумма всех элементов' 
 end do 
Deallocate(A)
Enddo
End Program Matrix

在文件中是

10.05   -22.0   3.0
4.0 0.0 60.0
8.0 13.0    22.5 

标签: fortranfortran90

解决方案


正如我所写,您的问题中有太多要点。因此,很难做出一个很好地涵盖您的问题的答案,并且在没有真正理解问题的情况下不会只为您的家庭作业提供解决方案。

你的代码中有很多问题或奇怪的地方

  1. 我看不出外Do循环的原因。在此循环中,您将尝试多次读取文件。没有保护读取超过文件末尾的内容。

  2. 从文件中读取时,您始终使用allocate数组。但是您永远不会deallocate在外Do循环的下一次迭代中尝试再次分配它们,但这是不允许的,它们已经分配了。
    也许您只想读取整个文件一次?

  3. 我总是建议分步学习。首先根据需要阅读文件,打印它,确认它是您需要的形式。仅计算正常平均值。然后才计算排除最大值和最小值的平均值。

  4. 忽略最大值和最小值很简单,只需从总和中减去它们,然后将元素的数量减少 2。但是,由于您的代码的其余部分非常混乱,因此不可能仅将其添加到那里。我将仅展示该过程的草图:

数组的正常平均值a(1:n)

avg = sum(a) / n

除最大值和最小值外的所有元素的平均值:

avg2 = (sum(a) - minval(a) - maxval(a)) / (n - 2)

推荐阅读