需求:借助colSums()编写无%*%的单循环矩阵乘法算法
用colSums实现单循环矩阵乘法
核心思路
矩阵乘法中,若有矩阵 A(n×k)和 B(k×m),乘积 C = A %*% B 的第 j 列,本质是 A 的每一行与 B 的第 j 列做元素对应相乘后求和的结果。利用这一点,我们可以通过循环遍历B的每一列,结合colSums()计算出C的对应列,最终拼接得到完整结果。
实现代码
matrix_mult <- function(A, B) { # 检查矩阵维度合法性 if(ncol(A) != nrow(B)) stop("A的列数必须等于B的行数") n <- nrow(A) m <- ncol(B) # 初始化结果矩阵 C <- matrix(NA, nrow = n, ncol = m) # 单循环:遍历B的每一列 for(j in 1:m) { # 将B的第j列与A的每一行做元素对应相乘,再按列求和得到C的第j列 C[, j] <- colSums(t(A) * B[, j]) } return(C) }
测试验证
# 构造测试矩阵 A <- matrix(1:6, nrow = 2) B <- matrix(7:12, ncol = 2) # 自定义函数计算结果 my_result <- matrix_mult(A, B) # 内置运算符验证 base_result <- A %*% B # 对比结果 all.equal(my_result, base_result) # 输出:TRUE
补充说明
t(A)将A转置为k×n的矩阵,B[,j]是k×1的向量,两者相乘会自动触发R的向量循环规则,得到k×n的矩阵,每一行是A的对应列与B[j]元素的乘积。colSums()对这个k×n矩阵按列求和,正好得到A的每一行与B[,j]的点积,也就是C的第j列。- 整个过程仅对
B的列做一次循环,符合单循环要求,且未使用%*%运算符。
内容的提问来源于stack exchange,提问作者user22074276
相关产品推荐
相关产品推荐

