【发布时间】:2013-09-14 12:17:26
【问题描述】:
我正在尝试对每个 i 和每个 g 与 i 进行矩阵乘法 S_g。到目前为止,这是我尝试过的,但是需要花费大量时间才能完成。有没有一种计算效率更高的方法来做完全相同的事情?
这个公式的主要注意事项是S_g 在矩阵乘法设置中使用 X_gamma 和 Y[,i]。 X_gamma 取决于值g。因此,对于每个 i,我必须执行 g 矩阵乘法。
逻辑如下:
- 对于每个 i,需要对每个 g 进行计算。然后,对于每个 g,选择 X_gamma 作为 X 的子集。这是确定 X_gamma 的方法。让我们取 g = 3。当我们查看 'set[3,]' 时,我们发现 B 列是唯一一个值为 != 0 的列。因此,我选择 X 中的 B 列,那就是 X_gamma。
我的主要问题是在现实中,g = 13,000 和 i = 700。
library(foreach)
library(doParallel) ## parallel backend for the foreach function
registerDoParallel()
T = 3
c = 100
X <- zoo(data.frame(A = c(0.1, 0.2, 0.3), B = c(0.4, 0.5, 0.6), C = c(0.7,0.8,0.9)),
order.by = seq(from = as.Date("2013-01-01"), length.out = 3, by = "month"))
Y <- zoo(data.frame(Stock1 = rnorm(3,0,0.5), Stock2 = rnorm(3,0,0.5), Stock3 = rnorm(3,0,0.5)),
order.by = seq(from = as.Date("2013-01-01"), length.out = 3, by = "month"))
l <- rep(list(0:1),ncol(X))
set = do.call(expand.grid, l)
colnames(set) <- colnames(X)
I = diag(T)
denom <- foreach(i=1:ncol(Y)) %dopar% {
library(zoo)
library(stats)
library(Matrix)
library(base)
result = c()
for(g in 1:nrow(set)) {
X_gamma = X[,which(colnames(X) %in% colnames(set[which(set[g,] != 0)]))]
S_g = Y[,i] %*% (I - (c/(1+c))*(X_gamma %*% solve(crossprod(X_gamma)) %*% t(X_gamma))) %*% Y[,i]
result[g] = ((1+c)^(-sum(set[g,])/2)) * ((S_g)^(-T/2))
}
sum(result)
}
感谢您的帮助!
【问题讨论】:
-
我将库添加到代码中。这就是你对我的问题投反对票的原因吗?
-
我没有投反对票。可能是您的问题不清楚您想做什么。
-
感谢指标。不幸的是,我无法发布可重现的示例。我试图尽可能多地澄清我的问题..
-
我不确定您是否可以在
data.table中复制这些内容。 -
我不知道组成几个小矩阵有什么难的。如果你想让别人花精力帮助你,你应该先花一些自己。
标签: r performance loops foreach parallel-processing