【问题标题】:Filling up a symmetric matrix and finding an expression in a fastest possible way填充对称矩阵并以最快的方式找到表达式
【发布时间】: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 向量ab 执行以下操作

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


【解决方案1】:

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

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

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

根据我目前的测试,您的方法似乎是 R 中最快的方法。

【讨论】:

  • 感谢您的回复!我有三个厘米。 1)如果xy 不同,在我的情况下大约需要0.04 秒。根据这个观察,我预计 0.005 秒。如果在您的系统中花费更多时间,那也没关系。正如我在问题中所问的那样,您只需提供您能想到的最快方法。 2)在我的例子中,x=y,所以你不必计算所有元素,因为dnorm(a-b)=dnorm(b-a)dnorm(0) 都需要计算一次。 3)U可以以某种我想不到的方式使用包parallel来使用不同的内核。我听说这可以显着加快代码速度。
  • @Shanks 抱歉,但您似乎没有看到我提出的观点。对于这个(我的)计算,xy 是长度为 199990000 的向量。这表示您需要计算值的单位数(只有下三角部分,对于完整矩阵,它将是 4 亿)。由于这个操作对我来说需要 12 sek,我看不出它如何可以减少到 0.005 sek 用于您的模拟。还是我误会了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2017-02-22
  • 2018-01-23
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多