【发布时间】:2016-06-20 08:48:49
【问题描述】:
我有一个包含三个二维数组的列表,其中包含一些点的x、y 和z 坐标(为了从中绘制曲面,我将它们存储在二维数组中,例如曲面图在 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 <- 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)需要以二维数组/矩阵形式呈现点。这种形式添加了关于哪些点是允许构建适当网格的邻居的信息。