我有一个(大)数组需要计算。该数组具有三个维度,但到目前为止,我只能在没有循环的情况下完成第一个维度(而其他两个维度则通过写出的循环)。
y <- array(0.0, dim = c(numberScenarios, (numberYears + 1), numberMaturities))
for (t in 1:(numberYears + 1)){
for (tau in 1:numberMaturities){
y[, t, tau] <- exp(- (phi[tau, t] + psi[tau, 1] * x1[, t] +
psi[tau, 2] * x2[, t] +
psi[tau, 3] * x3[, t]) / tau) - 1}}
y
的任何计算都不涉及自身,因此不存在需要循环的递归。
那么,有没有办法以更矩阵代数(并且可能更快)的方式来解决这个问题?
请注意,所有变量的大小都适合此类计算。
我不清楚你想做什么。然而,对于多维计算,使用不同长度的输入向量通常更容易使用
expand.grid
函数而不是数组,然后处理结果数据帧的行。例如
a <- 1:4
b <- 1:2
c <- 1:5
df <- expand.grid(a = a, b = b, c = c)
head(df)
1 1 1 1
2 2 1 1
3 3 1 1
4 4 1 1
5 1 2 1
6 2 2 1
result <- 2 * df[1] - df[2] + 4 * df[3]
head(result)
a
1 5
2 7
3 9
4 11
5 4
6 6
如果此方法映射到您的问题 a,b 和 c 将是您的输入向量,结果将是您定义的函数
如果可能,考虑按整个向量而不是单个元素分配:
t <- 1:(numberYears + 1)
tau <- 1:numberMaturities
y[, t, tau] <- exp(
-(
phi[tau, t] +
psi[tau, 1] * x1[, t] +
psi[tau, 2] * x2[, t] +
psi[tau, 3] * x3[, t]
) / tau
) - 1