R中二维数组列表的矩阵乘法

时间:2016-03-06 21:41:35

标签: r matrix

我有一个包含三个二维数组的列表,其中包含某些点的xyz坐标(为了从中绘制表面,我将它们存储在两个中 - 维数组,如MATLAB中的表面图。

示例:

points <- list(x=matrix(c(1, 2, 3, 4), nrow=2), 
               y=matrix(c(5, 6, 1, 4), nrow=2), 
               z=matrix(c(1, 9, 2, 3), nrow=2))

这是坐标为(1, 5, 1)(2, 6, 9)等的点的表示(总共4个点)。

现在我必须将每个(x, y, z)点与一些固定矩阵C相乘(以旋转我的曲面),并以二维矩阵列表的相同形式返回结果。

我可以用循环这样做:

apply_matrix <- function(C, points) {
  x <- points$x
  y <- points$y
  z <- points$z
  n <- nrow(x)
  m <- ncol(x)
  outx <- matrix(rep(0, n*m), nrow = n)
  outy <- matrix(rep(0, n*m), nrow = n)
  outz <- matrix(rep(0, n*m), nrow = n)

  for (i in 1:nrow(x)) {
    for (j in 1:ncol(x)) {
      out <- C %*% c(x[i, j], y[i, j], z[i, j])
      outx[i,j] <- out[1,]
      outy[i,j] <- out[2,]
      outz[i,j] <- out[3,]
    }
  }
  list(x=outx,y=outy,z=outz)
}

但是,我正在寻找更有效的无环路解决方案。

我相信可以将列表转换为三维矩阵,然后让R使用适当的维度将我的矩阵C乘以这个三维矩阵,但无法弄清楚如何去做。 / p>

1 个答案:

答案 0 :(得分:1)

这里我首先将列表转换为三维数组,然后返回一个:

C <- matrix(rnorm(3 * 3), 3)
ar <- array(unlist(points), c(dim(points[[1]]), 3))
aperm(apply(ar, 1:2, `%*%`, x = t(C)), c(2, 3, 1))