数组计算如何避免多次循环?

问题描述 投票:0回答:2

我有一个(大)数组需要计算。该数组具有三个维度,但到目前为止,我只能在没有循环的情况下完成第一个维度(而其他两个维度则通过写出的循环)。

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
的任何计算都不涉及自身,因此不存在需要循环的递归。

那么,有没有办法以更矩阵代数(并且可能更快)的方式来解决这个问题?

请注意,所有变量的大小都适合此类计算。

r arrays matrix multidimensional-array
2个回答
0
投票

我不清楚你想做什么。然而,对于多维计算,使用不同长度的输入向量通常更容易使用

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 将是您的输入向量,结果将是您定义的函数


0
投票

如果可能,考虑按整个向量而不是单个元素分配:

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
© www.soinside.com 2019 - 2024. All rights reserved.