gpt4 book ai didi

r - 为矩阵向量化 min()

转载 作者:行者123 更新时间:2023-12-02 05:36:24 25 4
gpt4 key购买 nike

我希望对以下循环进行矢量化:

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 内在函数。所以如果你写一个简单的 C 代码,使用 _mm_min_pd来自 SSE2 ,您将从 pmin 获得约 2 倍的加速;如果你看到_mm256_min_pd从 AVX,您将获得比 pmin 约 4 倍的加速.

不幸的是,R 本身不能执行任何 SIMD。 我在 Does R leverage SIMD when doing vectorized calculations? 的帖子中有一个答案。关于这个问题。对于您的问题,即使您将 R 链接到 HPC BLAS,pmin不会受益于 SIMD,仅仅因为 pmin不涉及任何 BLAS 操作。因此,更好的选择是自己编写编译后的代码。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com