【发布时间】: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 将其更改为一个简单的等式,因为在这种情况下,将I 和i 分开并不重要。
但是在接下来的计算中,我将要进行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