Fortran计算大数组RNDVI、GNDVI最值均值标准差无输出问题求助
Fortran代码无法输出统计值的错误原因及修正方案
核心错误点
- 文件指针位置错误:完成
RNDVI、GNDVI的写入操作后,5、6号文件的指针已经位于文件末尾,此时直接执行READ操作无法读取到任何有效数据,且这一步“写了再读”完全是多余操作——数组内已经存储了计算好的NDVI值,无需再通过文件中转。 - 无效值未过滤:只有
Seag(Row, Col)==1的位置才计算了NDVI值,其余位置的数组值为未初始化的垃圾值。你计算均值、标准差时没有过滤这部分垃圾值,且判断条件RNDVI(Row, Col)/=1逻辑完全错误,NDVI的取值范围是[-1,1],符合条件的有效值大多不等于1。 - 语法与逻辑错误:计算
m1的代码行缺少右括号,属于语法错误;sum()、size()本身就是全数组操作函数,不需要嵌套在两层循环中反复执行,重复计算不仅冗余还会导致结果错误。 - 变量调用错误:最大最小值计算结果存储在
location1、location2、location3、location4变量中,但输出时调用的是未赋值的location变量,自然无法输出正确位置的NDVI值。 - 数组读写顺序不匹配:Fortran数组是列优先存储,直接执行
WRITE(5,*)RNDVI会按列顺序写入文件,后续读取时你按行循环读取,就算文件指针位置正确,读入的数组值顺序也是完全错乱的。
修正建议
- 删除“写入NDVI到文件后再读取”的冗余代码段,直接使用内存中已计算好的
RNDVI、GNDVI数组做统计计算。 - 统计计算时使用
Seag==1作为掩码过滤无效值,示例代码如下:
! 计算RNDVI统计值,仅统计海草存在的区域 m1 = sum(RNDVI, mask=Seag==1) / count(Seag==1) s1 = sqrt(sum((RNDVI - m1)**2, mask=Seag==1) / count(Seag==1)) ! GNDVI统计值同理 m2 = sum(GNDVI, mask=Seag==1) / count(Seag==1) s2 = sqrt(sum((GNDVI - m2)**2, mask=Seag==1) / count(Seag==1))
- 输出最大最小值时替换为正确的变量名,示例如下:
WRITE (*, *) location1, RNDVI(location1(1),location1(2)) WRITE (*, *) location2, RNDVI(location2(1),location2(2)) WRITE (*, *) location3, GNDVI(location3(1),location3(2)) WRITE (*, *) location4, GNDVI(location4(1),location4(2))
- 如果确实需要保存NDVI到文件,按行循环写入,保证读写顺序一致:
DO Row= 1, Nrow WRITE(5,*)(RNDVI(Row, Col), Col=1, Ncol) WRITE(6,*)(GNDVI(Row, Col), Col=1, Ncol) END DO
内容的提问来源于stack exchange,提问作者Kodi Feldpausch
相关产品推荐
相关产品推荐

