填充对称矩阵并以最快的方式查找表达式

问题描述 投票:1回答:1

我有一个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矢量ab以下

a = rnorm(n); b = rcauchy(n)
s = rowSums(G)
sum(((a/s) * (G %*% (b/a)))^2)

我知道使用parallel多核可以使代码更快。但我不知道如何在我的环境中使用它。任何建议将不胜感激。

注:评论部分有一些建议。当然,这些使代码更快,因此我真的很感激。但我正在寻找一种方法,如果可能的话,可以使整个代码更快。

r performance matrix vector vectorization
1个回答
0
投票

对不起,但你的期望似乎很不切实际。要计算20k * 20k矩阵下部,我们需要计算(n * n-n)/ 2 = 199990000个值。但,

system.time(dnorm((x-y)/h)) # 12.47 

这种长度随机向量在我的系统上最简单的计算需要~12 sek。但我们仍然需要创建大对称矩阵。所以我看不出如何在~0.005秒内计算出来(使用R)。

从我目前的测试来看,你的方法似乎是在R中做到这一点的最快方法。

© www.soinside.com 2019 - 2024. All rights reserved.