如何正确记录fortran矩阵最小值和最大值之间的平均值计数

how to correctly record the counting of averages between the minimum and maximum of the matrix on 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 

正如我所写,你的问题中的要点太多了。因此很难做出一个答案,既能很好地涵盖你的问题,又不会在你没有真正理解问题的情况下只给你一个作业的解决方案。

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

  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)