如何用Fortran求矩阵各列最小值并计算对应列其余元素和
Fortran实现矩阵列最小值位置替换为列其余元素和的方法
需求说明
给定一个300×178的矩阵,需完成以下操作:
- 计算每一列的最小值,得到长度为178的结果数组
- 在原矩阵中,将每列最小值所在的位置替换为该列其余所有元素的和,其余位置设为0(若某列存在多个最小值,所有对应位置都执行替换)
示例
原矩阵:
1 4 6 3 2 6 7 4 5 1 5 7
最终结果矩阵:
8 0 0 14 0 0 0 0 0 11 18 0
实现思路
- 先计算每列的总和:列其余元素的和 = 列总和 - 列最小值(总和减去最小值即可得到剩余元素的和)
- 遍历每一列,获取该列的最小值
- 逐行检查当前列的元素,若等于最小值则替换为“总和-最小值”,否则设为0
Fortran代码实现
program matrix_min_replace implicit none ! 定义矩阵维度,根据实际需求调整 integer, parameter :: rows = 300, cols = 178 ! 若矩阵为整数类型,将real改为integer即可 real :: mat(rows, cols) real :: col_min(cols), col_sum(cols) integer :: i, j ! -------------- 矩阵初始化部分 -------------- ! 此处替换为你的矩阵初始化逻辑: ! 比如从文件读取:open(10, file='matrix.txt', status='old'); read(10, *) mat; close(10) ! 或者手动赋值(测试小矩阵时可修改rows和cols为3和4) ! mat = reshape([1.0,2.0,5.0,4.0,6.0,1.0,6.0,7.0,5.0,3.0,4.0,7.0], [3,4]) ! 计算每列的总和与最小值 do j = 1, cols col_sum(j) = sum(mat(:, j)) col_min(j) = minval(mat(:, j)) end do ! 生成结果矩阵 do j = 1, cols do i = 1, rows if (mat(i, j) == col_min(j)) then mat(i, j) = col_sum(j) - col_min(j) else mat(i, j) = 0.0 end if end do end do ! -------------- 结果输出部分 -------------- ! 按行输出结果矩阵,格式可根据需要调整 do i = 1, rows write(*, '(178F6.1)') mat(i, :) end do end program matrix_min_replace
代码说明
implicit none:强制变量声明,避免隐式类型匹配错误sum(mat(:, j))和minval(mat(:, j)):分别计算第j列的总和与最小值,是Fortran内置的数组操作函数,简洁高效- 双重循环遍历矩阵:外层循环处理列,内层循环处理行,完成替换逻辑
- 若矩阵为整数类型,只需将代码中的
real替换为integer,输出格式调整为(178I6)即可适配
内容的提问来源于stack exchange,提问作者Yoni Verhaegen
相关产品推荐
相关产品推荐

