【问题标题】:R: element-wise matrix divisionR:逐元素矩阵除法
【发布时间】:2016-09-15 20:34:00
【问题描述】:

给定两个相同维度的数字矩阵AB。元素划分的最佳方法是什么:A[i,j] / B[i,j]?我知道可以使用双 for 循环。但我想要最有效的方法。

编辑:如果有B[i,j] == 0,则必须是A[i,j] <- 0

【问题讨论】:

    标签: r performance matrix


    【解决方案1】:

    如果您的矩阵是AB,您可以只使用A / B

    A <- matrix(1:4, 2, 2)
    #     [,1] [,2]
    #[1,]    1    3
    #[2,]    2    4
    
    B <- matrix((1:4) * 2, 2, 2)
    #     [,1] [,2]
    #[1,]    2    6
    #[2,]    4    8
    
    C <- A / B
    #     [,1] [,2]
    #[1,]  0.5  0.5
    #[2,]  0.5  0.5
    

    当有B[i,j] == 0 时,它必须是A[i,j] &lt;- 0

    如果 B 中有 0 个元素,则可能会得到 NaNInf-Inf,具体取决于 A 中的对应项。

    0 / 0
    # NA
    
    1 / 0
    # Inf
    
    -1 / 0
    # -Inf
    

    所有这些都不是有限的。如果您想用 0 替换它们,只需执行以下操作:

    C <- A / B
    C[!is.finite(C)] <- 0
    

    很难记住 R 如何处理 NANaNInf-Inf。您可以阅读?is.finite?NA 了解一般信息。这里我做一个简单的测试。

    x <- c(NA, NaN, Inf, -Inf)
    
    is.finite(x)
    # [1] FALSE FALSE FALSE FALSE
    
    is.infinite(x)
    # [1] FALSE FALSE  TRUE  TRUE
    
    is.na(x)
    # [1]  TRUE  TRUE FALSE FALSE
    
    is.nan(x)
    # [1] FALSE  TRUE FALSE FALSE
    

    注意,is.infinite 不是is.finite 的倒数,而是is.na 的倒数。这就是我使用!is.finite的原因。

    【讨论】:

    猜你喜欢
    • 2016-06-04
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2014-11-13
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多