我有一个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
多核可以使代码更快。但我不知道如何在我的环境中使用它。任何建议将不胜感激。
注:评论部分有一些建议。当然,这些使代码更快,因此我真的很感激。但我正在寻找一种方法,如果可能的话,可以使整个代码更快。
对不起,但你的期望似乎很不切实际。要计算20k * 20k矩阵下部,我们需要计算(n * n-n)/ 2 = 199990000个值。但,
system.time(dnorm((x-y)/h)) # 12.47
这种长度随机向量在我的系统上最简单的计算需要~12 sek。但我们仍然需要创建大对称矩阵。所以我看不出如何在~0.005秒内计算出来(使用R)。
从我目前的测试来看,你的方法似乎是在R中做到这一点的最快方法。