我有一个n x n
对称矩阵G
,其(i,j)th
元素是g(h(i),h(j))
,其中g(i,j) = g(j,i)
和g(i,i)
对于所有{ {1}}。 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)
配合使用可使代码更快。但是我不知道如何在我的环境中使用它。任何建议将不胜感激。
在评论部分有一些建议。当然,这些可以使代码更快,因此,我非常感谢这些。但是我正在寻找一种方法,如果可能的话,可以使整个代码更快。
答案 0 :(得分:0)
对不起,但是您的期望似乎不切实际。 要计算20k * 20k矩阵的下半部分,我们需要计算(n * n-n)/ 2 = 199990000个值。 但是,
system.time(dnorm((x-y)/h)) # 12.47
在我的系统上,对于这种长度的随机向量,这种最简单的计算大约需要12 sek。 但是我们仍然需要创建大型对称矩阵。因此,我看不到如何在约0.005秒(使用R)中计算出来。
从我目前的测试来看,您的方法似乎是在R中最快的方法。