如何在不使用for循环或apply的情况下找出矩阵中目标元素最多的行
高效找出矩阵中符合条件的行(禁用for循环与apply)
需求说明
- 给定矩阵,找出拥有最多小于右侧后续元素的元素的行
- 限制:不得使用
for循环或apply系列函数 - 现有问题:对
seq(1,1000)生成的1000×1000矩阵执行操作耗时22秒,需优化性能
示例矩阵
A = 6 4 2 3 3 3 1 2 3 7 8 8 2 4 5
示例结果:符合条件的是第3行和第5行
解决方案(向量化实现)
利用R的向量化底层优化实现高效计算,完全避免循环:
# 构造示例矩阵 A <- matrix(c(6,4,2,3,3,3,1,2,3,7,8,8,2,4,5), nrow=5, byrow=TRUE) # 计算每行中元素小于右侧元素的数量 counts <- rowSums(A[, -ncol(A)] < A[, -1], na.rm = TRUE) # 筛选出数量最多的行号 max_count <- max(counts) target_rows <- which(counts == max_count) # 输出结果 target_rows
原理说明
A[, -ncol(A)]取原矩阵除最后一列的所有列,A[, -1]取原矩阵除第一列的所有列,两者维度完全匹配- 逐元素比较得到逻辑矩阵,
rowSums统计每行TRUE的数量(即符合条件的元素数) - 最后找出最大值对应的行号即可
这种向量化操作由R底层C代码实现,性能远高于循环/apply,能极大降低大矩阵的计算耗时
内容的提问来源于stack exchange,提问作者Texas2022
相关产品推荐
相关产品推荐

