【问题标题】:How to extract and record values, and their respective column/row information, from a matrix for 3D rendering?如何从矩阵中提取和记录值及其各自的列/行信息以进行 3D 渲染?
【发布时间】:2017-02-24 05:51:31
【问题描述】:

我将热图像作为 480 X 640 矩阵带入 R。隔离我的“信号”(田地中的幼苗)后,我想将值导出到 data.table,同时记录每个观察的行和列。我需要一个包含 x、y、z 信息的最终 data.table。我正在将原始热矩阵绘制为rgl 中的 3D 表面,并希望在我的渲染中制作另一个 3D 层来说明我的“信号”。

所以我从如下示例数据开始:

library(data.table)
library(rgl)

dd <- data.table(c(1,0,1,2,1,0,2,1,0,2),
                 c(0,1,2,1,3,2,4,1,2,0),
                 c(3,2,1,3,2,4,3,2,1,0),
                 c(2,1,0,2,1,3,2,3,1,1),
                 c(0,1,2,1,3,2,0,1,1,3))

bb <- as.matrix(dd) # save a copy for later

find_signal = function(DT, max, min) {  # inverse of Dowle's NA remover
  for (j in seq_len(ncol(DT)))
    set(DT,which(DT[[j]] < min),j,NA)
  for (j in seq_len(ncol(DT)))
    set(DT,which(DT[[j]] > max),j,NA)
}

find_signal(dd, 2.0001, 1.9999)

所以现在,在消除“噪音”之后,我的 data.table 只包含与我的“信号”相关的值。此时它看起来像这样:

    V1 V2 V3 V4 V5
 1: NA NA NA  2 NA
 2: NA NA  2 NA NA
 3: NA  2 NA NA  2
 4:  2 NA NA  2 NA
 5: NA NA  2 NA NA
 6: NA  2 NA NA  2
 7:  2 NA NA  2 NA
 8: NA NA  2 NA NA
 9: NA  2 NA NA NA
10:  2 NA NA NA NA

我正在研究如何导出这些值,同时在热图像中记录它们各自的位置。我需要将每个观察值以及相应的行和列信息导出到另一个 data.table。这样做的目的是在rgl 场景中渲染另一层并进一步分析,如欧几里得距离计算。

假设输出如下:

y <- c(1,2,3,4,5,1,2,3,4,5,1,2,3,4)
x <- c(10,9,8,7,6,7,6,5,4,3,4,3,2,1)
z <- c(2,2,2,2,2,2,2,2,2,2,2,2,2,2)

aa <- data.table(x,y,z)

看起来像这样:

     x y z
 1: 10 1 2
 2:  9 2 2
 3:  8 3 2
 4:  7 4 2
 5:  6 5 2
 6:  7 1 2
 7:  6 2 2
 8:  5 3 2
 9:  4 4 2
10:  3 5 2
11:  4 1 2
12:  3 2 2
13:  2 3 2
14:  1 4 2

允许我创建一个 rgl 场景,就像使用以下代码渲染的场景:

xb <- c(1:nrow(bb)); yb <- c(1:ncol(bb))

persp3d(x= xb, y= yb, z= bb, col = "blue")+
lines3d(aa$x[1:5], aa$y[1:5],  z= z+1, col = "green", lwd = 5)+  # my signal
lines3d(aa$x[6:10], aa$y[6:10], z= z+1,col = "green", lwd = 5)+
lines3d(aa$x[11:14], aa$y[11:14], z= z+1, col = "green", lwd = 5)

同样,如何从 data.table(或矩阵)导出值,同时记录每个值的列号和行号?

感谢您的建议

【问题讨论】:

标签: r matrix data.table rgl


【解决方案1】:

您可以使用row()col() 函数找到矩阵每个条目的索引。所以对于你的例子:

keep <- !is.na(bb)
cbind( x = row(bb)[keep], y = col(bb)[keep], z = bb[keep]  )

产生这个输出:

       x y z
 [1,]  4 1 2
 [2,]  7 1 2
 [3,] 10 1 2
 [4,]  3 2 2
 [5,]  6 2 2
 [6,]  9 2 2
 [7,]  2 3 2
 [8,]  5 3 2
 [9,]  8 3 2
[10,]  1 4 2
[11,]  4 4 2
[12,]  7 4 2
[13,]  3 5 2
[14,]  6 5 2

这不是您要求的顺序;如果重要,请使用order()

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多