任何替代的solve()都很慢

时间:2017-03-25 23:45:27

标签: r performance

A代表每个国家的行业与其他国家的其他行业有多大关系。它可能需要大约1.00的值。因此,矩阵A的对角线元素接近1,但矩阵A的非对角元素远小于1,因为每个行业主要与自身相关。

我,J代表每个1:44的国家,
警告! (求解中的“I”(I-A_omit(J,j))是诊断(2464) i,j代表每个1:56的行业。

X是输出,它是一个长度为44个国家的矢量X 56个工业= 2464
它通过(diag(2464)-A)的倒数乘以F(矩阵是2464 * 1矩阵表示特定国家的行业最终需求)来计算。

X_omit(J,j)是将国家J的工业j中的所有值变为零的函数。
在这里,矩阵X的第j + 56 *(J-1)列被转动为零。
顺便说一句,解决(I-A_omit(J,j))中的“我”是诊断(2464)。

X_omit(使用solve)的一次计算大约需要20秒。 A是2464 * 2464矩阵,X是2464 * 1矩阵。 我假设计算b_link需要大约20秒* 2464计算,这对于一个单独的值是14小时 但在这种情况下,我设法使用sum将其更改为简单的等式,因为在这种情况下,将Ii分开并不重要。 但在接下来的计算中我要做的是,IiJj这是维度1:44,1:56,1:44,1:56,每个字母都应该分开,而不仅仅是使用总和。

我认为让它更快的唯一方法是使solve()更快20秒。 solve(I-A_omit(J,j))中的[A]矩阵不是对称的,只是填充了数字的普通矩阵。

这是我的代码

X_omit <- function (J,j) {solve((I-A_omit(J,j)),F)}
B_linkages_inter <- function (I,J) {
  for (j in 1:56) {
    for (i in 1:56) {
      sum((X[i+56*(I-1)]-X_omit(J,j)[i+56*(I-1)])/X[j+56*(J-1)])
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您可以在循环外计算X_omit(J,j)。此外,您还可以在循环外计算X[j+56*(J-1)])