我希望对以下循环进行矢量化处理:
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)
,但这并没有给我想要的结果。有没有一种方法可以向量化此循环以使其更快?
只需使用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中“矢量化”的含义与HPC中的“ SIMD矢量化”不同。R是一种解释型语言,因此R中的“向量化”意味着选择C级循环而不是R级循环。因此,pmin
仅使用一个简单的C循环进行编码。
真正的高性能计算应受益于SIMD向量化。我相信您知道SSE / AVX内在函数。因此,如果您使用_mm_min_pd
from编写一个简单的C代码,则from的SSE2
速度将是〜的2倍pmin
。如果_mm256_min_pd
从AVX看到,则将获得〜4倍的加速pmin
。
不幸的是,R本身不能执行任何SIMD。我在做矢量化计算时R是否会利用SIMD的帖子有一个答案。关于这个问题。对于您的问题,即使将R链接到HPC BLAS,pmin
也不会因为pmin
不涉及任何BLAS操作而从SIMD中受益。因此,更好的选择是自己编写编译后的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句