You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:借助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:52:38