首页 > 解决方案 > 将 Fortran 矩阵的元素与整个矩阵的平均值进行比较,并记住最接近它的数字的索引

问题描述

正如标题所说,我很难看到哪个元素最接近整个矩阵的平均值。

我认为用平均值减去矩阵中的一个元素,然后对下一个元素做同样的事情,然后比较它们,我会得到一些结果,但我认为我没有正确地做到这一点。

subroutine PP(mat,N,x,y)
dimension mat(100,100)
r = 0
counter = 0
do i = 1,N
do j = 1,N

r = r + mat(i,j)
counter = counter + 1

enddo
enddo

average = r / counter

x=1
y=1

do i = 1,N
do j = 1,N

if(mat(i,j).ge.0)then
position1 = average - mat(i,j)
elseif(mat(i,j).lt.0)then
position1 = average + mat(i,j)
endif

if(mat(i+1,j).ge.0)then
position2 = average - mat(i+1,j)
elseif(mat(i+1,j).lt.0)then
position2 = average + mat(i+1,j)
endif

if(position1.lt.position2)then

endif

enddo
enddo
return
end

Program Example
dimension mat(100,100)

read*,N

read*,((mat(i,j),j=1,N),i=1,N)

call PP(mat,N,x,y)

print*,x
print*,y

end

标签: fortran

解决方案


我在这台机器上没有 Fortran,所以下面的内容可能存在一些语法错误。首先,让我们找出 中所有值的平均值mat

mean = sum(mat)/size(mat)

接下来,我们要找到最接近该均值的元素的位置。表达方式

abs(mat-mean)

返回数组中元素与均值之差的绝对值,以及函数调用

minloc(abs(mat-mean))

返回一个整数数组,给出在数组中找到最小差异的位置。在这种情况下minloc,将返回一个 2 元素整数数组,给出该最小值的位置。如果有多个位置具有相同的值,则minloc仅返回找到的第一个。

我的方法的一个潜在问题是子表达式abs(mat-mean)很可能需要创建一个临时矩阵。这可能很耗时,而且肯定会消耗内存。如果其中任何一个是关键问题,请考虑使用基于循环的方法。

顺便说一句:您编写代码的方式并不能确保当它执行时N已知子例程的值是100这样的,因此可能不会检查数组的每个元素,并且可能会在数组边界之外徘徊。我上面概述的方法避免了这些问题,因为它从来没有明确说明要检查多少元素。


推荐阅读