我有一个方阵,尺寸从WxWW00xW00不等.该矩阵表示函数的参数值.我经历了一个循环,在那里我try 了各种参数组合.每次迭代W都有一个不同的值,所以我必须更新矩阵中值为W的位置.这恰好是对角线的偶数项,所以[2,2][4,4]等等.我很好奇是否有比我现在的方法更有效的方法来做到这一点:

W<-treeDepth*newVar
for (iW in evenDiag) {
  matrixSource[iW,iW]<-W
}

到目前为止,我只测试了134x134大小的矩阵,但根据对profvis个大小的矩阵的分析,循环似乎是最快的方法.

当我try 的时候

diag(matrixSource)[evenDiag]<-W

它似乎花费了类似的时间,但它在平均每5个调用之后开始调用&lt;GC&>;,但实际调用&lt;GC&>的时间似乎是随机的.

我认为&lt;gc&gt;是垃圾回收,但无论它是什么,它永远都需要花费很长时间,而且当我使用上面的循环版本时,它很少被调用.

如果我认为有比逐个循环更好的方法,那我是错的吗?用Rcpp写循环会不会让速度更快?在《高级R》中,Hadley没有说用RCPP将值写入矩阵会更快,所以它可能不会.如果是这样,我如何才能在不编写C++函数或任何复杂的东西(我不知道任何C++)的情况下将这一小行(S)更改为RCPP.

根据我的研究,不可能只写这样的东西

matrixSource[evenDiag,evenDiag]<-W

但如果是这样的话,R将在矢量化处理方面表现出色.

什么是最好的方法呢?

如果它有帮助,那么背景是需要将矩阵输入

negLogLik<- -mvtnorm::dmvnorm(flattenedData,sigma=matrixSource,log=T,checkSymmetry = FALSE)

在该函数内部,它被提供给chol()(有时并行调用&lt;gc&gt;)

因此,如果有一种方法可以修改该函数,使其只处理不完全的部分矩阵 这样我可能只需要给W赋值一次,这也是很好的.

我还需要一种方法来分配主对角线正上方和下方的对角线,所有相同的值,Z.有好的方法吗?

谢谢您&lt;3

推荐答案

I have not found memory problems with square matrices up to dimension 1000.
@MichaelChirico's suggestion seems to be the most efficient. It runs in time constant with the matrix dimension, unlike diag<-.
The two methods used below are

# create an index
i <- rep(c(FALSE, TRUE), ncol(A) %/% 2)
j <- which(i)

# can also be diag(A)[i]
diag(A)[j] <- W

# cannot be cbind(i, i)
A[cbind(j, j)] <- 0

cbind显然更有效率.

library(microbenchmark)
library(ggplot2)

testFun <- function(N) {
  out <- lapply(seq.int(N)[-1L], \(n) {
    A <- matrix(1:n^2, n, n)
    W <- rep(0L, ncol(A) %/% 2L)
    i <- rep(c(FALSE, TRUE), ncol(A) %/% 2)
    j <- which(i)
    mb <- microbenchmark(
      diag = {diag(A)[i] <- W},
      cbind = {A[cbind(j, j)] <- W}
    )
    mb$dim <- n
    mb
  })
  out <- do.call(rbind, out)
  aggregate(time ~ ., out, median)
}

testData <- testFun(1000)
ggplot(testData, aes(dim, time, colour = expr)) +
  geom_line() +
  geom_point() +
  theme_bw()

创建于2024-01-14与reprex v2.0.2


Edit

另一种分配方阵对角线元素的方法是由comment中的user20650提出的.将上面的timimg指令调用更改为

mb <- microbenchmark(
  diag = {diag(A)[i] <- W},
  cbind = {A[cbind(j, j)] <- W},
  sq = {A[j*j] <- W}
)

而情节(没有diag)就变成了

enter image description here

R相关问答推荐

给定R中另一行中的值,如何插补缺失值

在ggplot的注释表格中突出显示最大值

r中的stat_difference函数不起作用

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

MCMC和零事件二元逻辑回归

从R导出全局环境中的所有sf(numrames)对象

如何在区分不同条件的同时可视化跨时间的连续变量?

在ggplot中为不同几何体使用不同的 colored颜色 比例

一小时满足条件的日期的 Select

在不丢失空值的情况下取消列出嵌套列表

将重复项转换为NA

根据列表中项目的名称合并数据框和列表

自定义gggraph,使geom_abline图层仅在沿x轴的特定范围内显示

如何使这些react 表对象相互独立?

R中的类别比较

使用不同的定性属性定制主成分分析中点的 colored颜色 和形状

R中时间间隔的大向量与参考时间间隔的相交

用多边形替换地块点

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容

子样本间系数检验的比较