如何实现矩阵第n列与行向量第n个元素的逐列除法?
矩阵列按对应向量元素除法的解决方案
我懂你要实现的需求:让矩阵的每一列都单独除以向量中对应位置的元素。你之前用apply没得到想要的结果,问题出在除法的逻辑上——你写的x / b会让列向量的每个元素和b的每个元素做元素-wise除法,而不是整列除以b里对应列的那个元素。
用apply实现的正确写法
我们可以给apply的自定义函数传入列的索引,确保每一列都对应b中相同位置的元素:
a <- matrix(1:9, byrow = TRUE, nrow = 3) b <- c(3:5) # 正确的apply实现 result <- apply(a, 2, function(col, vec, col_idx) col / vec[col_idx], vec = b, col_idx = 1:ncol(a))
这里的逻辑很直观:
apply(a, 2, ...)会按列遍历矩阵a- 自定义函数接收当前处理的列
col、目标向量vec(也就是b),以及当前列的索引col_idx - 每一列
col都除以vec[col_idx],也就是b中对应这个列的元素
运行后得到的结果完全符合你的要求:
[,1] [,2] [,3] [1,] 0.3333333 0.5 0.6 [2,] 1.3333333 1.25 1.2 [3,] 2.3333333 2.0 1.8
更简洁的非循环/非apply方法
其实不用apply也能轻松实现,利用R的矩阵广播特性,构造一个和a同维度的矩阵(每一列都是b的对应元素),然后直接做元素-wise除法:
# 方法1:构造同维度矩阵 result <- a / matrix(b, nrow = nrow(a), ncol = ncol(a), byrow = TRUE) # 方法2:用rep重复向量元素匹配行数 result <- a / rep(b, each = nrow(a))
这两种方法都能得到和apply写法一致的结果,代码还更简洁。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

