【发布时间】:2019-09-11 20:56:57
【问题描述】:
我有一个n x n 对称矩阵G,其(i,j)th 元素是g(h(i),h(j)),其中g(i,j) = g(j,i) 和g(i,i) 对于所有i 都是常数。这里g 采用实线值。在我的例子中,g 是高斯核。
我尝试输入矩阵如下。
h = 0.01
operator = function(x,y){
return(dnorm((x-y)/h))
}
a = 1; b = 0.5; n = 20000
x = seq(1,n,1)
vec = a*x + b*x^2 #example of h(x)
G = outer(vec, vec, FUN = operator)
但是,我在这里计算矩阵的所有条目,这不是必需的。只有下三角矩阵和对角线的一个元素就足够了。我能做些什么来实现它? (我认为使用ifelse 会使代码变慢。)
然后我想对两个n x 1 向量a 和b 执行以下操作
a = rnorm(n); b = rcauchy(n)
s = rowSums(G)
sum(((a/s) * (G %*% (b/a)))^2)
我知道在parallel 中使用多核可以让代码更快。但我不知道如何在我的设置中使用它。任何建议将不胜感激。
注意评论区有一些建议。当然,这些使代码更快,因此我非常感谢这些。但我正在寻找一种方法,如果可能的话,可以让整段代码更快。
【问题讨论】:
-
你能分享一个样本
g吗?g向量化了吗? -
g是一个在实线中取值的函数。我已经提供了一个例子。感谢您的评论,@Gregor! -
感谢
dnorm示例---您的真实函数是否类似地矢量化了?以dnorm为例,我们可以使用operator(x, x[1])一次性获取矩阵的第一列,因此我们可以使用for循环(甚至是并行化的foreach)来执行类似@ 的操作987654345@ 相当有效。你的真实算子是否同样矢量化了? -
是的,我的真实算子也是类似矢量化的。谢谢!
-
@Shanks 我认为
operator不是你真正的功能?也许你可以提供你真正的?
标签: r performance matrix vector vectorization