R语言矩阵运算:基于两个矩阵生成新矩阵的方法求助
解决矩阵交叉乘积求和的高效方案(R + Excel)
我来帮你搞定这个问题!你要做的本质就是矩阵乘法——刚好你的两个矩阵维度调整后就能直接相乘,不管用R还是Excel都能一键完成,完全不用手动处理几百条数据,比你现在的操作高效太多。
R语言方案(自动处理行列,无需手动指定)
你之前觉得R需要手动指定矩阵值和行列信息是误解啦,CSV读进来的表格可以直接转成带行列名的矩阵,关键是对齐维度:
- 你的Matrix1是「元素(行)×站点(列)」,Matrix2是「费用(行)×元素(列)」,那Matrix3 = Matrix2 × Matrix1,结果正好是「费用(行)×站点(列)」,完全符合你的需求。
具体步骤:
- 读入CSV文件(假设你的CSV第一列是行名,比如Matrix1第一列是元素名,Matrix2第一列是费用名):
# 读入数据,指定第一列为行名 matrix1_df <- read.csv("matrix1.csv", row.names = 1) matrix2_df <- read.csv("matrix2.csv", row.names = 1) - 转成矩阵:
matrix1 <- as.matrix(matrix1_df) matrix2 <- as.matrix(matrix2_df) - 执行矩阵乘法,直接得到Matrix3:
matrix3 <- matrix2 %*% matrix1 - 导出结果到CSV(可选):
write.csv(matrix3, "matrix3.csv")
这个过程完全自动保留行列名,几百条数据几秒就能跑完,根本不用手动设置任何值。
Excel方案(学习曲线平缓,用MMULT函数)
Excel里用MMULT函数就能实现同样的矩阵乘法,不用逐行拉公式:
- 先确认数据区域:Matrix1的数值区域(不含元素名列)的行数 = Matrix2的数值区域(不含费用名列)的列数(也就是元素的数量),这是矩阵相乘的前提。
- 选中要存放Matrix3的空白区域:行数等于Matrix2的费用数,列数等于Matrix1的站点数。
- 在编辑栏输入数组公式:
比如Matrix2的数值区域是B1:C10(B、C列是对应元素的费用),Matrix1的数值区域是F1:H20(F、G、H列是对应站点的元素值),那公式就是:=MMULT(B1:C10, F1:H20) - 输入完成后,按Ctrl+Shift+Enter(Excel 365及以后版本直接按Enter即可),整个区域会自动填充所有计算结果。
注意:如果你的表格带表头/行名,选区域的时候要避开这些文本,只选数值部分。
不管用哪种方法,核心都是利用矩阵乘法的特性自动完成所有元素的乘积求和,比手动操作效率提升N倍,数据量越大越明显。
内容的提问来源于stack exchange,提问作者communityecologist




