首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对矩阵中行的哪个操作进行矢量化

对矩阵中行的哪个操作进行矢量化
EN

Stack Overflow用户
提问于 2020-02-06 14:47:59
回答 4查看 123关注 0票数 3

我想要矢量化(apply)矩阵X上的which操作,如下面的for循环所示,其结果是向量ind

代码语言:javascript
复制
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中每一行的索引,该元素的最高值小于VX行对应元素所指示的值。

操作max将所有合格索引的向量映射到标量。或者,我会很高兴地看到一个操作返回,例如,所有索引的list (我可以lapply max)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-02-06 15:05:19

如果矩阵的值增加了,就像你所分享的例子(当然,我对此表示怀疑),但是如果它增加了,你可以简单地做,

代码语言:javascript
复制
rowSums(X < V)
#[1] 4 3 4 0

但是,如果不是这样的话,那么一个简单的apply就足够了。

代码语言:javascript
复制
apply(X < V, 1, function(i)max(which(i)))
#[1]    4    3    4 -Inf

请记住,所有的数学运算都是矢量化的,所以<是矢量化的。

您可以像往常一样替换-Inf

票数 3
EN

Stack Overflow用户

发布于 2020-02-06 15:06:53

代码语言:javascript
复制
apply(
    (X < V) * X
    , 1
    , which.max
)
票数 3
EN

Stack Overflow用户

发布于 2020-02-06 14:59:26

下面是一个简单的示例

代码语言:javascript
复制
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]) ))

mymax = function(matrix, sample) {
    whichlist = which(matrix < sample)
    max(0, whichlist)
}
ind2 = unlist(lapply(1:nrow(X), function(r) mymax(X[r,], V[r])))

identical(ind, ind2)
# [1] TRUE
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60097628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档