我有一个包含三个二维数组的列表,其中包含某些点的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
乘以这个三维矩阵,但无法弄清楚如何去做。 / p>
答案 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))