如何在R中按指定行列规则由两个矩阵生成新矩阵?
嘿,我来帮你搞定这个R矩阵计算的问题!你需要生成的new矩阵,核心逻辑是**new[i,j]等于ev的第i行和mat的第j行对应元素相乘后求和**,完全对应你给出的逐行逐列计算示例。下面给你两种实现方式,从易懂到高效都有:
方法1:逐行逐列循环(直观对应你的计算逻辑)
如果想完全贴合你描述的步骤,用嵌套循环就能实现,逻辑一目了然:
# 先初始化和ev维度一致的空矩阵 new <- matrix(0, nrow = nrow(ev), ncol = ncol(ev)) # 遍历new的每一行和每一列,按规则计算 for (i in 1:nrow(new)) { for (j in 1:ncol(new)) { new[i,j] <- sum(ev[i, ] * mat[j, ]) } } # 给结果加上行列名,保持和原矩阵一致 colnames(new) <- colnames(ev) rownames(new) <- rownames(ev) # 查看最终结果 new
这个方法适合理解计算逻辑,小矩阵场景下完全够用。
方法2:矩阵乘法(高效简洁,推荐)
其实你的计算规则可以转化为矩阵乘法,不需要写循环——R的矩阵运算底层做了优化,速度更快,代码也更精简:
# 核心计算:ev 乘以 mat 的转置 new <- ev %*% t(mat) # 补充行列名 colnames(new) <- colnames(ev) rownames(new) <- rownames(ev) new
为什么是ev %*% t(mat)?
简单解释下:
t(mat)会把mat的行转成列,原来的mat[j, ](第j行)就变成了t(mat)[ ,j](第j列)- 矩阵乘法中,
ev(4×3)和t(mat)(3×3)相乘后,结果的第i行第j列,正好是ev第i行和t(mat)第j列的点积——也就是ev[i, ]和mat[j, ]对应元素相乘求和,完美匹配你的需求!
结果验证
咱们手动算几个值确认一下:
new[1,1] = sum(ev[1,] * mat[1,]) = 2*1 + 0*0 + 3*0.4 = 3.2new[4,3] = sum(ev[4,] * mat[3,]) = 0*0.4 + 0*0.6 + 4*1 = 4
你提供的new示例数值可能存在笔误,用上面两种方法得到的结果才是符合规则的正确值~
内容的提问来源于stack exchange,提问作者R.Hanovre
相关产品推荐
相关产品推荐

