我希望将以下循环 vector 化:

for (i in 1:n) {
    for (j in 1:m) {
        temp_mat[i,j]=min(temp_mat[i,j],1);
    }
}

我以为可以做temp_mat=min(temp_mat,1),但这没有给我想要的结果。有没有一种方法可以 vector 化此循环以使其更快?

最佳答案

只需使用temp_mat <- pmin(temp_mat, 1)即可。请参阅?pmin以更多地使用并行最小值。
例:

set.seed(0); A <- matrix(sample(1:3, 25, replace = T), 5)
#> A
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    3    1    1    3    3
#[2,]    1    3    1    2    3
#[3,]    2    3    1    3    1
#[4,]    2    2    3    3    2
#[5,]    3    2    2    2    1
B <- pmin(A, 2)
#> B
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    2    1    1    2    2
#[2,]    1    2    1    2    2
#[3,]    2    2    1    2    1
#[4,]    2    2    2    2    2
#[5,]    2    2    2    2    1

更新
由于您具有计算科学的背景,因此我想提供更多信息。pmin速度很快,但远非高性能。其前缀“parallel”仅表示element-wise。 R中“ vector 化”的含义与HPC中的“SIMD vector 化”不同。 R是一种解释型语言,因此R中的“ vector 化”意味着选择C级循环而不是R级循环。 因此,pmin仅使用一个简单的C循环进行编码。
真正的高性能计算应受益于SIMD vector 化。 ,我相信您知道SSE / AVX内在函数。因此,如果您使用_mm_min_pd中的SSE2编写简单的C代码,则pmin的速度将提高约2倍;如果您从AVX看到_mm256_min_pd,则pmin的速度将提高约4倍。
不幸的是,R本身不能执行任何SIMD。 我对Does R leverage SIMD when doing vectorized calculations?上有关此问题的帖子有一个答案。对于您的问题,即使将R链接到HPC BLAS,仅pmin不涉及任何BLAS操作,pmin也不会从SIMD中受益。因此,更好的选择是自己编写编译代码。

关于r - 向量化矩阵的min(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37331375/

10-12 13:58