【问题标题】:Any alternatives of solve() which is slow任何缓慢的solve()替代方案
【发布时间】:2017-03-25 23:45:26
【问题描述】:

A 代表国家的每个行业与其他国家的其他行业的相关程度。它可以从 1.00 左右取值。所以矩阵 A 的对角元素接近 1,但矩阵 A 的非对角元素远小于 1,因为每个行业大多与自身相关。

I,J 代表国家/地区,每个国家/地区是 1:44,
警告! (solve(I-A_omit(J,j)) 中的“I”是一个诊断 (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) 列变为零。
顺便说一句,solve(I-A_omit(J,j)) 中的“I”是一个 diag(2464)。

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

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

这是我的代码

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)])
    }
  }
}

【问题讨论】:

  • 嗨,您能否将代码添加到您的问题中,而不是图像。谢谢ps。 [如果你添加一个小例子,人们可以使用的预期结果会很棒:然后焦点可以转移到将其扩展到问题维度]
  • 感谢您的更新,但请尝试添加一个小得多的示例,以显示您要执行的操作:也许将其附加到问题的底部。
  • 您可以使用solve(A,b) 代替solve(A)%*%b。这会更快,因为它实际上并没有反转矩阵。如果它仍然很慢,您可以尝试使用 R 的 Revolution R 开放发行版。
  • 感谢您的信息!我会在完成当前计算后立即尝试两者并告诉您哪个更快。
  • "X_omit(J,j) 是一个函数,它将国家 J 的行业 j 中的所有值都变为零。" - 不,不是。 “将国家 J 的行业 j 的所有值变为零的函数”不需要调用solve。

标签: r performance


【解决方案1】:

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

【讨论】:

  • 我已将代码更改为国家间反向链接,其中没有任何东西(在我看来)可以超出循环。 A_omit
  • 您为什么要更改代码,使其无法超出其范围?
  • 前一个是国内的后向链接。现在,它是国家之间的后向联系,这也是我需要知道的数据。
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2014-12-27
  • 2010-10-03
  • 2011-11-05
相关资源
最近更新 更多