需要帮助矢量化双重for循环,在R中创建矢量差异的规范矩阵

时间:2014-12-01 11:28:40

标签: r vectorization

我正在试图弄清楚如何在R中对以下代码块进行矢量化:

X是N×M矩阵

中心是K x M矩阵

  phi <- matrix(0, nrow(X), nrow(centers))
  for(i in 1:nrow(phi)) {
    for(j in 1:ncol(phi)) {
      phi[i, j] <- norm(as.matrix(X[i, ]) - as.matrix(centers[j, ]), type = 'F')
    }
  }

我正在构造一个N x K矩阵,phi,在每个位置,[i,j],包含X的第i行和中心的第j行的向量之差的范数:

phi [i,j] = || X [i,] - 中心[j,] ||

到目前为止,我的方法是尝试使用R的outer()函数。我是外部()函数的新手,所以我搜索了几个例子,但是,我遇到的例子涉及使用outer()将一些函数应用于一对标量值向量。当我处理来自两个矩阵的行对之间的差异时,outer()的行为与预期的不同。我不知道如何让它识别我传递的矩阵(X和中心)作为向量的向量,其中每一行代表一个参与phi计算的向量。

此外,当我定义一个函数来计算两个M长度向量之间差异的范数时,该函数返回一个标量。我的理解是,为了使用R的Vectorize()来向量化函数,该函数必须返回与其参数长度相同的结果。我不确定如何定义一个函数,当与outer()一起使用时,它将矩阵的每一行识别为单个元素(尽管它是一个M长度向量)。

以下是我尝试将outer()与矩阵X和中心的玩具示例结合使用。

X <- matrix(c(7,8,9,1,2,3,4,5,6), 3, 3)
centers <- matrix(c(1,2,3,4,5,6), 2, 3)
fun <- function(y, x) norm(as.matrix(y) - as.matrix(x), type = 'F')
outer(X, centers, fun)

这是我的第一次尝试。我试图以类似于传递一对向量时的方式使用outer()。我(天真地)希望一次从每个矩阵中取一行,将它们作为两个参数传递给fun,并将结果适当地放在产品矩阵中。相反,我收到以下错误消息。

Error in outer(X, centers, fun) : 
  dims [product 54] do not match the length of object [1] 

我还尝试在调用outer()之前使用R的Vectorize()来向量化我的函数。

Vecfun <- Vectorize(fun)
outer(X, centers, Vecfun)

在这种情况下,我不再收到错误消息,但结果是错误的矩阵矩阵。我也是Vectorize()函数的新手,所以我不太清楚为什么它会产生它所做的结果,因为我没有真正掌握它的作用;使用它在黑暗中是一种射击。

我会感谢任何有关矢量化原始问题的帮助;我完全接受不涉及outer()的建议。

关于outer()和Vectorize()的澄清也很受欢迎。

0 个答案:

没有答案