如何从用于 3D 渲染的矩阵中提取和记录值及其各自的 column/row 信息?
How to extract and record values, and their respective column/row information, from a matrix for 3D rendering?
我将热图像作为 480 X 640 矩阵导入 R。隔离我的 "signal"(田里的幼苗)后,我想 将值导出到 data.table,同时记录每个观察值的行和列 。我需要一个包含基本 x、y、z 信息的最终 data.table。我在 rgl
中将原始热矩阵绘制为 3D 表面,并想在我的渲染中制作另一个 3D 图层来说明我的 "signal"。
所以我从示例数据开始,如下所示:
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)
所以现在,在删除 "noise" 之后,我的 data.table 只包含与我的 "signal" 相关的值。此时它看起来像这样:
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(或矩阵)中导出值,同时记录每个值的列号和行号?
谢谢指教
您可以使用 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()
。
我将热图像作为 480 X 640 矩阵导入 R。隔离我的 "signal"(田里的幼苗)后,我想 将值导出到 data.table,同时记录每个观察值的行和列 。我需要一个包含基本 x、y、z 信息的最终 data.table。我在 rgl
中将原始热矩阵绘制为 3D 表面,并想在我的渲染中制作另一个 3D 图层来说明我的 "signal"。
所以我从示例数据开始,如下所示:
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)
所以现在,在删除 "noise" 之后,我的 data.table 只包含与我的 "signal" 相关的值。此时它看起来像这样:
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(或矩阵)中导出值,同时记录每个值的列号和行号?
谢谢指教
您可以使用 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()
。