R语言如何计算矩阵每行以第24行为数值的加权均值
矩阵逐行加权均值计算实现指南
需求说明
你需要处理一个24行18列的数值矩阵,计算规则如下:
- 对矩阵第1行到第23行分别计算加权均值
- 每一行自身的元素值作为对应列的权重
- 矩阵第24行的同列元素值作为加权计算的实际数值
- 计算完成后在每行末尾追加一列,存储该行的加权均值结果,结果保留6位小数即可匹配示例效果
加权均值计算公式:
加权均值 = sum(当前行第j列元素 * 第24行第j列元素) / sum(当前行所有元素),其中j遍历所有18列。
原始矩阵数据
1 107 33 41 22 12 4 122 44 297 123 51 16 7 9 1 1 0 10 5 2 2 1 0 3 4 6 12 3 3 0 1 1 0 0 0 11 1 3 1 0 0 0 4 2 8 3 4 0 0 0 0 0 0 12 2 1 1 0 0 0 2 1 5 6 3 1 0 0 0 0 0 13 1 0 1 0 0 0 3 1 3 5 2 2 0 1 0 0 0 14 3 0 0 0 0 0 3 1 2 3 0 1 0 0 0 0 0 15 0 0 0 0 0 0 2 0 0 1 0 1 0 0 0 0 0 16 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 17 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 18 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 80 27 37 5 6 4 97 48 242 125 44 27 7 8 8 0 2 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 22 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 3 47 12 33 12 6 1 63 42 200 96 45 19 6 6 9 2 0 4 45 14 21 9 4 2 54 26 130 71 36 17 8 5 1 0 2 5 42 10 14 6 3 2 45 19 89 45 26 7 4 8 2 1 0 6 17 3 12 5 2 0 18 21 51 41 19 15 5 1 1 0 0 7 16 2 6 0 0 1 14 9 37 23 17 7 3 0 3 0 0 8 9 4 4 2 1 0 7 9 30 15 8 3 3 1 1 0 1 9 12 2 3 1 1 1 6 5 14 12 5 1 2 0 0 1 0 24 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
结果示例
前两行计算完成后的效果如下,末尾新增列为加权均值结果:
1 107 33 41 22 12 4 122 44 297 123 51 16 7 9 1 1 0 6.391011 10 5 2 2 1 0 3 4 6 12 3 3 0 1 1 0 0 0 6.232558
实现思路(Python实现,适合初学者)
不需要安装额外第三方库,用基础Python语法即可完成,步骤拆分如下:
- 把原始矩阵按行读取,每一行分割为整数数值存入二维列表
- 单独取出第24行(Python列表索引从0开始,对应索引值为23)作为数值基准行
- 遍历前23行(索引0到22),对每一行分别计算权重总和、加权乘积和,再做除法得到加权均值
- 把计算得到的均值追加到当前行末尾
- 按格式逐行输出最终结果即可
参考代码
# 读入原始矩阵数据 raw_data = """1 107 33 41 22 12 4 122 44 297 123 51 16 7 9 1 1 0 10 5 2 2 1 0 3 4 6 12 3 3 0 1 1 0 0 0 11 1 3 1 0 0 0 4 2 8 3 4 0 0 0 0 0 0 12 2 1 1 0 0 0 2 1 5 6 3 1 0 0 0 0 0 13 1 0 1 0 0 0 3 1 3 5 2 2 0 1 0 0 0 14 3 0 0 0 0 0 3 1 2 3 0 1 0 0 0 0 0 15 0 0 0 0 0 0 2 0 0 1 0 1 0 0 0 0 0 16 0 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 17 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 18 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 80 27 37 5 6 4 97 48 242 125 44 27 7 8 8 0 2 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 22 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 3 47 12 33 12 6 1 63 42 200 96 45 19 6 6 9 2 0 4 45 14 21 9 4 2 54 26 130 71 36 17 8 5 1 0 2 5 42 10 14 6 3 2 45 19 89 45 26 7 4 8 2 1 0 6 17 3 12 5 2 0 18 21 51 41 19 15 5 1 1 0 0 7 16 2 6 0 0 1 14 9 37 23 17 7 3 0 3 0 0 8 9 4 4 2 1 0 7 9 30 15 8 3 3 1 1 0 1 9 12 2 3 1 1 1 6 5 14 12 5 1 2 0 0 1 0 24 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16""" # 转换为整数类型二维列表 matrix = [] for line in raw_data.split('\n'): row = list(map(int, line.split())) matrix.append(row) # 取出第24行作为加权计算的基准值行 base_row = matrix[23] result = [] # 遍历前23行计算加权均值 for i in range(23): current_row = matrix[i] weight_sum = 0 product_sum = 0 for j in range(len(current_row)): weight = current_row[j] val = base_row[j] weight_sum += weight product_sum += weight * val # 处理权重和为0的特殊情况,避免除零报错 weighted_mean = product_sum / weight_sum if weight_sum != 0 else 0 # 追加均值到行末尾,保留6位小数匹配示例格式 new_row = current_row + [round(weighted_mean, 6)] result.append(new_row) # 追加原始第24行,逐行输出 result.append(matrix[23]) for row in result: print(' '.join(map(str, row)))
初学者注意点
- 绝大多数编程语言的列表/数组索引都是从0开始,不要直接按日常计数的行号1-24取数,容易出现索引越界或者取错行的问题
- 做除法前一定要判断分母(即权重总和)是否为0,否则程序会直接抛出除零错误崩溃
- 原始数据列之间的空格数量不固定,分割行内容时直接按空白字符分割即可,不需要严格匹配空格数量
- 如果需要更高精度的结果,可自行调整小数保留位数,示例中使用的6位小数可完全匹配给出的样例输出
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

