【问题标题】:check whether matrix rows equal a vector in R , vectorized检查矩阵行是否等于 R 中的向量,向量化
【发布时间】:2015-12-14 22:24:46
【问题描述】:

我很惊讶这个问题没有被问到,也许答案会弄清楚为什么。我想将矩阵的行与向量进行比较,并返回行 == 到处都是向量。请参见下面的示例。我想要一个矢量化解决方案,没有应用函数,因为矩阵太大而不能慢速循环。假设还有很多行,所以我想避免重复向量。

set.seed(1)

M = matrix(rpois(50,5),5,10)

v = c(3 ,   2 ,   7  ,  7 ,   4   , 4   , 7  ,  4  ,  5, 6)

M
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    4    8    3    5    9    4    5    6    7     7
[2,]    4    9    3    6    3    1    5    7    6     1
[3,]    5    6    6   11    6    4    5    2    7     5
[4,]    8    6    4    4    3    8    3    6    5     6
[5,]    3    2    7    7    4    4    7    4    5     6

输出应该是

FALSE  FALSE FALSE FALSE TRUE

【问题讨论】:

    标签: r matrix vector vectorization


    【解决方案1】:

    一种可能性是

    rowSums(M == v[col(M)]) == ncol(M)
    ## [1] FALSE FALSE FALSE FALSE  TRUE
    

    或者类似

    rowSums(M == rep(v, each = nrow(M))) == ncol(M)
    ## [1] FALSE FALSE FALSE FALSE  TRUE
    

    或者

    colSums(t(M) == v) == ncol(M)
    ## [1] FALSE FALSE FALSE FALSE  TRUE
    

    v[col(M)] 只是rep(v, each = nrow(M)) 的较短版本,它创建一个与M 大小相同的向量(矩阵只是一个向量,试试c(M)),然后使用@987654328 将每个元素与其对应的元素进行比较@。幸运的是== 是一个通用函数,它有一个array 方法(参见methods("Ops")is.array(M)),它允许我们在它上面运行rowSums(或colSums)以确保我们有数量匹配为ncol(M)

    【讨论】:

    • 我希望避免使用 rep(),因为 M 是一个非常非常大的矩阵,所以为这个简单的逻辑任务创建另一个矩阵会很麻烦。
    • colSums(t(M) == v) == ncol(M) 更好吗?这不是“简单的逻辑任务”顺便说一句
    【解决方案2】:

    使用 DeMorgan 规则(不是全部 = 有些不),那么全部相等 = 不是有些不相等,我们也有

    !colSums(t(M) != v)
    

    【讨论】:

      【解决方案3】:

      prodlim 包有一个名为row.match 的函数,它易于使用,非常适合您的问题。首先安装并加载库:library(prodlim)。在我们的示例中,row.match 将返回“5”,因为M 中的第 5 行等于 v。然后我们可以将其转换为逻辑向量。

      m <- row.match(v, M)
      m==1:NROW(M)#[1] FALSE FALSE FALSE FALSE  TRUE
      

      【讨论】:

        猜你喜欢
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        相关资源
        最近更新 更多