fortran - 将 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,所以下面的内容可能存在一些语法错误。首先,让我们找出 中所有值的平均值mat
:
mean = sum(mat)/size(mat)
接下来,我们要找到最接近该均值的元素的位置。表达方式
abs(mat-mean)
返回数组中元素与均值之差的绝对值,以及函数调用
minloc(abs(mat-mean))
返回一个整数数组,给出在数组中找到最小差异的位置。在这种情况下minloc
,将返回一个 2 元素整数数组,给出该最小值的位置。如果有多个位置具有相同的值,则minloc
仅返回找到的第一个。
我的方法的一个潜在问题是子表达式abs(mat-mean)
很可能需要创建一个临时矩阵。这可能很耗时,而且肯定会消耗内存。如果其中任何一个是关键问题,请考虑使用基于循环的方法。
顺便说一句:您编写代码的方式并不能确保当它执行时N
已知子例程的值是100
这样的,因此可能不会检查数组的每个元素,并且可能会在数组边界之外徘徊。我上面概述的方法避免了这些问题,因为它从来没有明确说明要检查多少元素。
推荐阅读
- deployment - 如何将内部/订阅者角色设置为 WSO2 Api 管理器中所有经过身份验证的用户的默认角色?
- python-3.x - 在 tkinter 框中刷新并显示更新时间
- c++ - C++ 中的内联代码:选项及其优点/缺点
- javascript - 无法读取未定义的属性“MessageEmbed”试图创建嵌入
- reactjs - 无法从子级读取未定义调用父函数的属性“道具”
- c# - 样式 System.Windows.Controls.ComboBox 不显示 selectedItem
- wso2 - 是否有任何机制可以从代码中从 WSO2 Esb 中的用户存储中获取 userProfile 信息?
- python - 当用户调整 GUI 的大小时,有没有办法改变 GUI 内容的大小?
- json - jq:如何在其他字段中使用相同的搜索而不重复代码?
- azure - 是否有任何 Poweshell 脚本或 az 命令来获取产品列表及其 API 管理的订阅 ID?