gpt4 book ai didi

r - 用于从 R 中的网格创建三角形列表的加速函数

转载 作者:行者123 更新时间:2023-12-04 11:41:07 31 4
gpt4 key购买 nike

我在 R 中编写了一个函数 mesh2listri(),它接受一个 kxm 矩阵和一个三角形结构矩阵,并返回一个列表,其中每个元素都是一个定义三角形的 3xm 矩阵。我真的很想加快这个功能。但是,我不知道如何避免 for 循环。在此先感谢您的帮助。下面是一个完全可重现的示例。

mesh2listri <- function(mat, tri) {
if (ncol(tri) > 3) {
tri <- t(tri)
}
res <- NULL
for (i in 1:nrow(tri)) {
resi <- mat[tri[i, ], ]
res <- c(res, list(resi))
print(i)
}
res
}

mat <- matrix(rnorm(90000, 0, 1), ncol = 3)
tri <- matrix(sample(1:30000, replace = TRUE), ncol = 3)
system.time(mesh2listri(mat, tri))

最佳答案

快一点。

mesh2listri_byMinem <- function(mat, tri) {
if (ncol(tri) > 3) tri <- t(tri)
n <- nrow(tri)
l <- vector(mode = "list", length = n)
for (i in 1:n) {
resi <- mat[tri[i, ], ]
l[[i]] <- resi
}
l
}

# create larger data:
mat <- matrix(rnorm(6e6, 0, 1), ncol = 3)
tri <- matrix(sample(3e5, replace = T), ncol = 3)

b <- microbenchmark::microbenchmark(
rez1 <- mesh2listri_new(mat, tri),
rez2 <- mesh2listri_byMinem(mat, tri), times = 10, unit = "s"
)
options(digits = 2)
b
# Unit: seconds
# expr min lq mean median uq max neval cld
# rez1 <- mesh2listri_new(mat, tri) 0.630 0.85 0.94 0.85 0.92 1.86 10 b
# rez2 <- mesh2listri_byMinem(mat, tri) 0.092 0.10 0.11 0.10 0.10 0.15 10 a

关于r - 用于从 R 中的网格创建三角形列表的加速函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47572580/

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