gpt4 book ai didi

r - 有效地复制 R 中的矩阵

转载 作者:行者123 更新时间:2023-12-03 21:18:10 25 4
gpt4 key购买 nike

我有一个矩阵并寻找一种有效的方法来复制它 n 次(其中 n 是数据集中的观察次数)。例如,如果我有一个矩阵 A
A <- matrix(1:15, nrow=3)
然后我想要表单的输出
rbind(A, A, A, ...) #n times .

显然,构造这么大的矩阵有很多种方法,例如使用for循环或 apply或类似的功能。然而,对“矩阵复制函数”的调用发生在我的优化算法的核心中,在我的程序运行期间,它被调用了数万次。因此,循环、应用类型的函数以及任何类似的东西都不够高效。 (这样的解决方案基本上意味着对 n 的循环执行了数万次,这显然是低效的。)我已经尝试使用普通的 rep函数,但还没有找到安排 rep 输出的方法在所需格式的矩阵中。

解决方案do.call("rbind", replicate(n, A, simplify=F))也太低效了,因为 rbind在这种情况下使用过于频繁。 (然后,我的程序总运行时间的大约 30% 用于执行 rbind。)

有谁知道更好的解决方案?

最佳答案

还有两个解决方案:

第一个是对问题中示例的修改

do.call("rbind", rep(list(A), n))

第二个涉及展开矩阵,复制它,然后重新组装它。
matrix(rep(t(A),n), ncol=ncol(A), byrow=TRUE)

由于要求的是效率,因此必须进行基准测试
library("rbenchmark")
A <- matrix(1:15, nrow=3)
n <- 10

benchmark(rbind(A, A, A, A, A, A, A, A, A, A),
do.call("rbind", replicate(n, A, simplify=FALSE)),
do.call("rbind", rep(list(A), n)),
apply(A, 2, rep, n),
matrix(rep(t(A),n), ncol=ncol(A), byrow=TRUE),
order="relative", replications=100000)

这使:
                                                 test replications elapsed
1 rbind(A, A, A, A, A, A, A, A, A, A) 100000 0.91
3 do.call("rbind", rep(list(A), n)) 100000 1.42
5 matrix(rep(t(A), n), ncol = ncol(A), byrow = TRUE) 100000 2.20
2 do.call("rbind", replicate(n, A, simplify = FALSE)) 100000 3.03
4 apply(A, 2, rep, n) 100000 7.75
relative user.self sys.self user.child sys.child
1 1.000 0.91 0 NA NA
3 1.560 1.42 0 NA NA
5 2.418 2.19 0 NA NA
2 3.330 3.03 0 NA NA
4 8.516 7.73 0 NA NA

所以最快的是raw rbind调用,但假设 n是固定的并且提前知道。如 n不固定,那么最快的是 do.call("rbind", rep(list(A), n) .这些用于 3x5 矩阵和 10 次重复。不同大小的矩阵可能会给出不同的排序。

编辑:

对于 n=600,结果的顺序不同(排除显式 rbind 版本):
A <- matrix(1:15, nrow=3)
n <- 600

benchmark(do.call("rbind", replicate(n, A, simplify=FALSE)),
do.call("rbind", rep(list(A), n)),
apply(A, 2, rep, n),
matrix(rep(t(A),n), ncol=ncol(A), byrow=TRUE),
order="relative", replications=10000)

给予
                                                 test replications elapsed
4 matrix(rep(t(A), n), ncol = ncol(A), byrow = TRUE) 10000 1.74
3 apply(A, 2, rep, n) 10000 2.57
2 do.call("rbind", rep(list(A), n)) 10000 2.79
1 do.call("rbind", replicate(n, A, simplify = FALSE)) 10000 6.68
relative user.self sys.self user.child sys.child
4 1.000 1.75 0 NA NA
3 1.477 2.54 0 NA NA
2 1.603 2.79 0 NA NA
1 3.839 6.65 0 NA NA

如果包含显式 rbind版本,它比 do.call("rbind", rep(list(A), n)) 略快版本,但不多,而且比 apply 慢或 matrix版本。所以泛化到任意 n在这种情况下不需要速度损失。

关于r - 有效地复制 R 中的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13034861/

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