0

我正在尝试对一些 3D 扫描执行主成分分析,但是在计算和使用特征值和特征向量时我被卡住了。

扫描采用 .obj 文件格式。

     x          y         z
v 0.001888 -0.058120 -0.069146
v 0.007348 -0.066757 -0.062134
...                        ...
f 6436 6439 6445
f 6446 6445 6430

有 6449 个向量、12894 个面和 115 次扫描。我的理解是,由于数据是 3D 的,我无法使用内置princomp功能,而且由于数据量大,我可能会在笔记本电脑上遇到一些内存问题,最后我想学习手动进行 PCA。

我相信执行此操作有 5 个阶段

  1. 计算平均 3D 扫描。酒吧X
  2. 从每个扫描中减去平均值。Xa - BarX = 酒吧 Xa
  3. 创建一个 Bar Xa * Bar Xa = Ma 的矩阵
  4. 计算 Ma 的特征值和特征向量。帕
  5. 将平均形状 BarX 添加到 Pa 以根据特征值和特征向量查看形状变形

我希望我没有过度简化这一点,但由于我不是数学家/统计学家,这是我目前的理解。

第 1 阶段和第 2 阶段我已经完成了,因为它们很简单,但我对以下阶段感到困惑。

由于我担心遇到内存问题,我将分别为 x、y 和 z 创建一个矩阵。所以我正在创建一个 6449x6449 的对角矩阵,其中 x * x。这是我用来为第一次扫描的 x 创建矩阵的代码。

text <- readLines("R/location/scan1.obj", encoding="UTF-8")

xmat <- matrix(1:6449, ncol=1)
mat <- diag(6449)

for(i in 1:6449){
    xyzLine <- sub("v ", "", text[i])
    xyzList <- unlist(strsplit(xyzLine, " "))
    xmat[i, 1] = as.numeric(xyzList[1])
}

for(i in 1:6449){
    for(j in 1:6449){
        mat[i, j] <- xmat[i, 1] * xmat[j, 1]
    }
}

我对 x、y 和 z 执行此操作。然后使用计算特征值和特征向量

eigenx <- eigen(x)
eigeny <- eigen(y)
eigenz <- eigen(z)

在这个阶段我不确定我所做的是否正确?但是从这里开始,我不知道如何将特征向量和特征值组合成一种格式,我可以将它们添加到 BarX 上以查看形状变形?

如果有人有建议或指导,将不胜感激。

提前致谢。

4

0 回答 0