首页 > 解决方案 > 向量化跨矩阵行的操作

问题描述

我想对矩阵进行矢量化( apply)操作,如下面的循环所示,其结果是矢量:whichXforind

X   = matrix( 1:20, 4, 5 )
V   = sample( 1:20, 4 )
ind = numeric()
for( i in 1:nrow(X) ) ind[i] = max( c(0, which(X[i,] < V[i]) ))

该操作针对元素索引中的ind每一行返回,X其中最大值小于 的X-row-corresponding 元素所指示的值V

该操作max将所有合格索引的向量映射到一个标量。或者,我会对返回所有索引的例如 a 的操作感到满意list(我可以lapply max)。

标签: rvectorization

解决方案


如果您的矩阵具有增加的值,例如您共享的示例(我当然对此表示怀疑),但是如果确实如此,您可以简单地做,

rowSums(X < V)
#[1] 4 3 4 0

但是,如果不是这种情况,那么一个简单的apply就足够了,即

apply(X < V, 1, function(i)max(which(i)))
#[1]    4    3    4 -Inf

请记住,所有数学运算都是矢量化的,因此<也是矢量化的

-Inf您可以照常更换


推荐阅读