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

时间:2019-04-22 17:14:00

标签: r performance matrix vector vectorization

我有一个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 1a进行以下操作

b

我知道将多核与a = rnorm(n); b = rcauchy(n) s = rowSums(G) sum(((a/s) * (G %*% (b/a)))^2) 配合使用可使代码更快。但是我不知道如何在我的环境中使用它。任何建议将不胜感激。

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

1 个答案:

答案 0 :(得分:0)

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

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

在我的系统上,对于这种长度的随机向量,这种最简单的计算大约需要12 sek。 但是我们仍然需要创建大型对称矩阵。因此,我看不到如何在约0.005秒(使用R)中计算出来。

从我目前的测试来看,您的方法似乎是在R中最快的方法。