我有一个包含三个的二维数组的列表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)
}
但是,我正在寻找更有效的无环解决方案。
我相信可以将列表转换为三维矩阵,然后要求RC
使用适当的尺寸将矩阵乘以此三维矩阵,但无法弄清楚该怎么做。
在这里,我首先将列表转换为三维数组,然后还返回一个数组:
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句