【问题标题】:Matrix multiplication on list of two-dimensional arrays in RR中二维数组列表的矩阵乘法
【发布时间】:2016-06-20 08:48:49
【问题描述】:

我有一个包含三个二维数组的列表,其中包含一些点的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 乘以这个三维矩阵,但不知道该怎么做。

【问题讨论】:

  • 我不清楚为什么要将 xyz 数据存储在一组矩阵中​​。为什么不只是points &lt;- list(x= c(1, 2, 3, 4) , y=c(5, 6, 1, 4), z=c(1, 9, 2, 3) )。矩阵形式似乎没有添加任何信息。我确实知道如何在我建议的结构中执行请求的转换。
  • 像 plotly 这样的参数化曲面绘图仪(参见我们在此讨论的最后一个解决方案:stackoverflow.com/a/35821700/3025981)需要以二维数组/矩阵形式呈现点。这种形式添加了关于哪些点是允许构建适当网格的邻居的信息。

标签: r matrix


【解决方案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))

【讨论】:

  • 谢谢!我猜想我需要apply 函数之一,但几乎不可能记住哪个是正确的:) 实际上,我需要获得与最初相同的数据结构(x、y、z 的列表),所以我稍微修改了你的代码:out &lt;- apply(ar, 1:2, %*%, x = t(C)); list(x=out[1,,],y=out[2,,],z=out[3,,])。我不确定如何更优雅地进行最后一次转换,但它确实有效。
  • @IlyaV.Schurov,你也可以unlist(apply(out, 1, list), rec = FALSE)
猜你喜欢
  • 2014-02-28
  • 2021-08-14
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多