- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要确定由离散数据点表示的一系列表面下方的体积。在我的数据中,每个样本都存储为数据框列表中的单独数据框。这是一些(小的)示例数据:
df1 <- data.frame(x=c(2,2,2,3,3,3,4,4,4,5,5,5,6,6,6),
y=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
z=c(0,2,0,4,6,7,3,2,1,2,7,8,9,4,2))
df2 <- data.frame(x=c(2,2,2,3,3,3,4,4,4,5,5,5,6,6,6),
y=c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
z=c(1,1,2,3,5,6,2,1,3,3,8,9,8,3,1))
DF <- list(df1,df2)
类似问题的答案要么使用其他语言(matlab、python),要么答案不包含解决问题的可用脚本(as here)。我可以想到两种可接受的方法来估计每个表面下方的体积:1)写出辛普森规则的离散版本作为 R 中的函数,应用于数据框列表(DF); 2) 计算 x、y 和 z 之间的任意关系,并使用多元数值积分求表面下的体积(使用包 pracma 中的 simpson2d/quad2d 或 cubature 中的 adaptIntegrate 等函数)。
关于第一种方法,复合辛普森规则的公式(我想使用)是 here ,但由于其复杂性,我未能成功编写有效的双重求和函数。在这个表达式中,I(lambda(em) lambda(ex)) 在每个 x,y 网格点处都等于上述数据集中的 z,Delta(em) 和 Delta(ex) 表示 x 和 y 点之间的间隔。
第二种方法本质上是扩展方法 found here多元样条拟合,然后将预测的 z 值作为积分函数传递。到目前为止,这是我为这种方法所做的尝试:
require(pracma)
df1.loess <- loess(z ~ x + y, data=DF[[1]])
mod.fun <- function(x,y) predict(df1.loess, newdata=x,y)
simpson2d(mod.fun, x=c(2,6), y=c(1,3))
但这不会产生有用的结果。
实际上,我有一个包含近 100 个数据框的单个样本列表,因此我确实需要能够将解决方案表示为一系列 lapply 函数,这些函数可以在列表中的所有数据框上自动执行这些计算。一个例子看起来像这样:
require(akima)
DF.splines <- lapply(DF, function(x,y,z) interp(x = "x", y = "y", z = "z",
linear=F, nx=4, ny=2))
不幸的是,这会产生缺失值和 Infs 的异常。我非常愿意接受有关如何成功实现这些策略之一或使用不同(更简单?)方法的任何建议。克里金函数(如 DiceKriging 程序包中的 km)是否可以产生更好的拟合以传递给数值积分?
最佳答案
我假设体积曲面网格是通过直线连接点定义的。然后你可以通过以下方式找到该表面下方的体积
(x,y)
网格的三角形分割为面积为 A_i
的三角形 T_i
T_i
找到相应的 z
值 Z_i
V_i=A_i*sum(Z_i )/3
(参见 https://en.wikipedia.org/wiki/Prism_(geometry) 和 https://math.stackexchange.com/questions/2371139/volume-of-truncated-prism)V_i
但是请记住,体积确实取决于您的镶嵌,而且镶嵌不是唯一的。但是你的问题没有完全定义,因为它没有描述应该如何在点之间进行插值。因此,任何计算体积的方法都必须做出额外的假设。
回到我的解决方法,第 1 点和第 2 点可以通过 geometry
包实现。这里有一些代码
library(geometry)
getVolume=function(df) {
#find triangular tesselation of (x,y) grid
res=delaunayn(as.matrix(df[,-3]),full=TRUE,options="Qz")
#calulates sum of truncated prism volumes
sum(mapply(function(triPoints,A) A/3*sum(df[triPoints,"z"]),
split.data.frame(res$tri,seq_along(res$areas)),
res$areas))
}
sapply(DF,getVolume)
#[1] 32.50000 30.33333
由于很难检查结果是否一致,这里有一个我们知道正确答案的简单示例。这是一个边长为 2 的立方体,我们沿 x 轴切出一个楔形。裁剪区域占总体积的1/4。
cutOutCube=expand.grid(c(0,1,2),c(0,1,2))
colnames(cutOutCube)=c("x","y")
cutOutCube$z=ifelse(cutOutCube$x==1,1,2)
sapply(list(cutOutCube),getVolume)
#[1] 6
这是正确的,因为 2^3*(1-1/4)=6
。
可以通过计算体积 w.r.t 的“补码”来执行另一项健全性检查。到一个简单的长方体,其中所有 z
值都设置为最大 z
值(在您的情况下 max(z)=9
在这两种情况下) .两种情况下的简单长方体体积均为 72。不让我们定义补面并求和体积和补体积
df1c=df1
df1c$z=max(df1c$z)-df1c$z
df2c=df2
df2c$z=max(df2c$z)-df2c$z
DFc=list(df1c,df2c)
sapply(DFc,getVolume)+sapply(DF,getVolume)
#[1] 72 72
因此,在这两种情况下,体积和补体体积都给出了正确的简单长方体体积。
关于r - 如何计算由离散数据定义的曲面下的体积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750035/
我正在尝试让这段代码计算盒子的表面积和体积。它编译但不输出正确的数据。我认为问题可能出在 void Box::零件内,但碰壁了。或者它可能是 Height = Height 但我无法以任何其他方式让它
我需要一个使用 kinect 计算 body 体积(以立方米为单位)的算法。我知道我可以提取云和深度框架(通过使用骨架 NUI 的一些方法隔离 body )但我不知道如何从这个矩阵计算体积值。导出卷
我是 d3 的新手,并试图根据节点之间的连接数使链接的宽度动态化。比方说,我们有: "links": [ { "source": a, "target": b},
我要渲染 3D 数据,它是一个一维数组。此数据在将进行可视化的同一程序中预先计算。数据表示统一的 3D 网格。网格的每个单元格都由一个 vector 组成。 GridSize = dx * dy *
我尝试在 jupyter notebook 中使用 mayavi 渲染体积来测试下面的示例 from mayavi import mlab mlab.init_notebook() x, y, z =
我尝试了几种不同的方法。我需要使用继承来扩展这些类。每次我运行该程序时,它都会输出 0.0 的体积和面积。半径显示正确。输出在底部。 public class Base_HW04Q1 { pu
我参与了一个项目,我需要根据体积的一系列图像渲染 3D 体积。这些图像是通过多种技术创建的,因此它们是所讨论对象的垂直切片。 数据集类似于this question , 但提问者正在寻找 Matlab
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines准则。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
我想知道是否有任何基于 numpy 的工具可以: 给定一个二值输入的 3D numpy 图像,找到它的凸包; 并返回索引列表或此 3D 凸包内的体素(3D 像素)的类似物。 一种可能是使用skimag
我要使用 Matlab 从灰度图像集创建一个 3D 体积。一组包含二维灰度图像的连续量化切片。我仍然认为自己是 Matlab 的菜鸟,但这是我目前的想法: 为 3D 体积创建一个空白空间。 在每张图片
我有一个 3D 体积和一个 2D 图像以及两者之间的近似映射(没有倾斜的仿射变换,已知缩放,旋转和平移近似已知并且需要拟合)。因为这个映射有错误,我想进一步将 2D 图像注册到 3D 体积。我以前没有
更新: 我创建了一个文档齐全的 ipython 笔记本。如果您只想要代码,请查看第一个答案。 问题 我有一个 40x40x40 体积的灰度值。这需要旋转/移动/剪切。 这是一组有用的齐次变换:http
看似简单的问题,没有图像处理/处理经验的人其实没那么容易。 我不只是想将 2D 阵列堆叠在一起,而是通过合并多个由空白分隔的二进制 2D 切片来创建 3D 体积。 例子: 用零定义一个 3D 矩阵:
我非常沮丧,因为几个小时后,我似乎无法在 python 中进行看似简单的 3D 插值。在 Matlab 中,我所要做的就是 Vi = interp3(x,y,z,V,xi,yi,zi) 使用 scip
我是一名优秀的程序员,十分优秀!