如何用R基础包替换矩阵乘法中的*为min/max等二元运算符
矩阵乘法替换运算符的R实现
原始代码示例
library(Matrix) A <- matrix(c(1,2,3,4,5,6), nrow=3) A t(A) A %*% t(A)
原始运行输出
# A # [,1] [,2] # [1,] 1 4 # [2,] 2 5 # [3,] 3 6 # # t(A) # [,1] [,2] [,3] # [1,] 1 2 3 # [2,] 4 5 6 # # A %*% t(A) # [,1] [,2] [,3] # [1,] 17 22 27 # [2,] 22 29 36 <--- # [3,] 27 36 45
技术问题
如何在R基础包中,将矩阵乘法中的乘法运算符*替换为其他二元运算符(如min或max)?
以结果矩阵的第2行第3列元素为例:
- 原矩阵乘法逻辑:
2 * 3 + 5 * 6 = 36 - 期望改为以下两种计算方式之一:
min(2,3) + min(5,6) = 7max(2,3) + max(5,6) = 9
解决方案
在R基础包里,不需要额外依赖包,通过自定义函数就能实现这类替换运算,核心是对矩阵的行和列逐元素执行目标运算后求和。
1. 替换为min的运算实现
# 自定义函数:对行和列的元素逐对取min后求和 matrix_min_sum <- function(row, mat_col) { colSums(pmin(row, mat_col)) } # 对矩阵A的每一行,和t(A)执行运算后转置得到结果 result_min <- t(apply(A, 1, matrix_min_sum, mat_col = t(A))) result_min
运行结果:
[,1] [,2] [,3] [1,] 5 6 7 [2,] 6 7 7 [3,] 7 7 9
其中第2行第3列的元素为7,符合预期。
2. 替换为max的运算实现
# 自定义函数:对行和列的元素逐对取max后求和 matrix_max_sum <- function(row, mat_col) { colSums(pmax(row, mat_col)) } # 执行运算 result_max <- t(apply(A, 1, matrix_max_sum, mat_col = t(A))) result_max
运行结果:
[,1] [,2] [,3] [1,] 8 9 10 [2,] 9 10 9 [3,] 10 9 12
其中第2行第3列的元素为9,符合预期。
3. 通用化替换
如果需要换成其他二元运算符,只需要修改pmin/pmax为目标函数即可,注意要保证函数支持向量化运算。比如想替换成减法,就把pmin换成-,再根据需求调整求和逻辑。
内容的提问来源于stack exchange,提问作者clp
相关产品推荐
相关产品推荐

