估计未定义表面的梯度

2023-11-26

我想估计一个梯度(斜率和坡向)不明确的表面(即函数未知)。为了测试我的方法,这里是测试数据:

require(raster); require(rasterVis)            
set.seed(123)
x <- runif(100, min = 0, max = 1)
y <- runif(100, min = 0, max = 1)
e <- 0.5 * rnorm(100)
test <- expand.grid(sort(x),sort(y))
names(test)<-c('X','Y')
z1 <- (5 * test$X^3 + sin(3*pi*test$Y))
realy <- matrix(z1, 100, 100, byrow = F)
# And a few plots for demonstration #
persp(sort(x), sort(y), realy, 
      xlab = 'X', ylab = "Y", zlab = 'Z',
      main = 'Real function (3d)', theta = 30, 
      phi = 30, ticktype = "simple", cex=1.4)
      contour(sort(x), sort(y), realy, 
      xlab = 'X', ylab = "Y",
      main = 'Real function (contours)', cex=1.4)

我将所有内容转换为栅格并使用rasterVis::vectorplot。一切看起来都很好。矢量场指示最大变化幅度的方向,阴影与我的等高线图类似......

test.rast <- raster(t(realy), xmn = 0, xmx = 1, 
                    ymn = 0, ymx = 1, crs = CRS("+proj"))
vectorplot(test.rast, par.settings=RdBuTheme, narrow = 100, reverse = T)

但是,我需要一个斜率值矩阵。据我了解向量图,它使用 raster::terrain 函数:

terr.mast <- list("slope" = matrix(nrow = 100, 
                                   ncol = 100, 
                                   terrain(test.rast, 
                                           opt = "slope", 
                                           unit = "degrees",
                                           reverse = TRUE, 
                                           neighbors = 8)@data@values, 
                                    byrow = T),
                  "aspect" = matrix(nrow = 100, 
                                    ncol = 100, 
                                    terrain(test.rast, 
                                            opt = "aspect", 
                                            unit = "degrees",
                                            reverse = TRUE, 
                                            neighbors = 8)@data@values, 
                                     byrow = T))

不过,坡度看起来真的很高...(90度就是垂直的,对吧?!)

terr.mast$slope[2:6,2:6] 
#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 87.96546 87.96546 87.96546 87.96550 87.96551
#[2,] 84.68628 84.68628 84.68627 84.68702 84.68709
#[3,] 84.41349 84.41350 84.41349 84.41436 84.41444
#[4,] 84.71757 84.71757 84.71756 84.71830 84.71837
#[5,] 79.48740 79.48741 79.48735 79.49315 79.49367

如果我绘制坡度和坡向,它们似乎与矢量图形不一致。

plot(terrain(test.rast, opt = c("slope", "aspect"), unit = "degrees", 
     reverse = TRUE, neighbors = 8))

我的想法:

  1. Vectorplot 必须平滑斜率,但是如何平滑呢?
  2. 我相当确定raster::terrain使用移动窗口方法来计算坡度。也许窗户太小了……这个可以扩大吗?
  3. 我是否以不恰当的方式处理这件事?我还能如何估计未定义表面的斜率?

我建立一个RasterLayer使用以下函数处理您的数据raster:

library(raster)
library(rasterVis)

test.rast <- raster(ncol=100, nrow=100, xmn = 0, xmx = 1,  ymn = 0, ymx = 1)
xy <- xyFromCell(test.rast, 1:ncell(test.rast))
test.rast[] <- 5*xy[,1] + sin(3*pi*xy[,2])

让我们显示这个对象levelplot:

levelplot(test.rast)

levelplot

和梯度向量场vectorplot:

vectorplot(test.rast)

vectorplot

如果你只需要坡度,你就可以得到它terrain:

slope <- terrain(test.rast, unit='degrees')

levelplot(slope, par.settings=BTCTheme())

slope

但是,如果我理解正确的话,你确实需要渐变,所以 您应该计算坡度和坡向:

sa <- terrain(test.rast, opt=c('slope', 'aspect'))

为了了解方法vectorplot正在绘制箭头, 在这里,我展示了其(修改后的)代码的一部分,其中水平 计算箭头的垂直分量:

dXY <- overlay(sa, fun=function(slope, aspect, ...){
    dx <- slope*sin(aspect) ##sin due to the angular definition of aspect
    dy <- slope*cos(aspect)
    c(dx, dy)
    })

因为原来的结构RasterLayer, 这 水平分量几乎是恒定的,所以让我们画出我们的 注意垂直分量。下一个代码覆盖 向量场在该垂直分量上的箭头。

levelplot(dXY, layers=2, par.settings=RdBuTheme()) +
    vectorplot(test.rast, region=FALSE)

dY

最后,如果您需要坡度和坡向的值,请使用getValues:

saVals <- getValues(sa)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

估计未定义表面的梯度 的相关文章

  • grep() 搜索数据框的列名

    有没有更清晰 更简单 更直接 更短的方法来做到这一点 其中 df1 是数据框 names df1 grep Yield names df1 我想返回任何包含单词 yield 的列名称 Thanks grep has a value应该适用于
  • R - 正则表达式错误(PCRE 版本)

    我正在尝试使用koRpus在 R 中在运行 RHEL6 的 Linux 服务器上进行词形还原 上周 当我安装了 MRO Microsoft R Open 3 2 3 时 下面的代码效果很好 library koRpus lw c danci
  • 如何生成向量的所有组合[重复]

    这个问题在这里已经有答案了 假设我有 3 个绿球 2 个橙球和 8 个黄球 我想订购它们 鉴于所有相同颜色的球都是相同的 如何生成所有可能的序列 在 R 中 使用gregmisc 我可以 balls lt c orange orange g
  • R从列表中提取数据框,列名中没有前缀

    我在列表中放置了一个数据框 然后 当尝试将其提取回来时 我得到了该数据帧的所有以列表键为前缀的列名称 有没有办法完全按照最初传递的方式提取数据帧 cols lt c column1 Column2 Column3 df1 lt data f
  • 使用 ggplot2 修改点子集的形状

    我正在尝试绘制一个沿大量维度变化的大型散点图 这是我的起始情节 p lt ggplot mtcars aes wt mpg shape cyl colour gear size carb geom point 使用mtcars数据集 我只是
  • dplyr 中的 Summarize 是否可以不删除数据框中的其他列?

    我有一个包含三列的数据框 我正在尝试进行简单的总结以查找数据框中每个城市的最高温度 但同时保留每个最高温度列出的日期 这是数据框 我们称之为 maxT new ID Date Max TemperatureF 1 TUS 1960 04 0
  • 将 JSON URL 转换为 R 数据帧

    我在将 JSON 文件 从 API 转换为 R 中的数据帧时遇到问题 例如 URL 我尝试了 S O 的一些不同建议 包括将json数据转换为R中的数据框 https stackoverflow com questions 28683769
  • 使用 R 的 flextable 包时,有没有办法将传递给 add_header_lines() 的字符串部分加粗

    我正在使用我喜欢的 flextable 包为 Word 文档创建几个表格 但是 我在将表格标题中的部分文本加粗时遇到了一些麻烦 例如 我希望标题为 Table 1 我的表格标题的其余部分 而不是 表 1 我的表格标题的其余部分 I 找到这个
  • 在函数内部调用 clusterApply 时,性能会下降

    我遇到了一个奇怪的问题clusterApply 我已经能够尽可能地隔离它 如下所示 首先 我从全局环境运行以下代码 require parallel cl lt makeCluster rep localhost 20 SOCK xl lt
  • dplyr,do(),从模型中提取参数而不丢失分组变量

    R 帮助中关于 do 的示例略有不同 by cyl lt group by mtcars cyl models lt by cyl gt do mod lm mpg disp data coefficients lt models gt d
  • R 中的发散积分可在 Wolfram 中求解

    我知道我以前问过同样的问题 但由于我是新来的 这个问题问得不好而且不可重现 因此我在这里尝试做得更好 如果我只编辑旧的 可能没有人会读它 我有一个想要积分的二重积分 ff lt function g t exp 16 g exp 8 t t
  • 在另一个 Rmd 中运行选定的块

    我已经在源 Rmd 文件中运行了分析 并且希望仅使用few来自源的块 我已经看到了一些关于从源 Rmd 中提取所有块的答案来自另一个 Rmd 中的 Rmd 文件的源代码 https stackoverflow com questions 4
  • 将函数应用于 3d 数组的每一层,返回一个数组

    假设您有一个包含行 列和层的 3 维数组 A lt array 1 27 c 3 3 3 想象你有一个函数 它接受一个矩阵作为输入并返回一个矩阵作为输出 就像t 如何将该函数应用于数组的每一层 返回与第一层大小相同的另一个数组 我觉得我应该
  • glmnet 未从 cv.glmnet 收敛 lambda.min

    我跑了20倍cv glmnet套索模型以获得 lambda 的 最佳 值 但是 当我尝试重现结果时glmnet 我收到一个错误 内容如下 Warning messages 1 from glmnet Fortran code error c
  • r 中的 5 维图

    我正在尝试在 R 中绘制 5 维图 我目前正在使用rgl包以 4 个维度绘制数据 使用 3 个变量作为 x y z 坐标 另一个变量作为颜色 我想知道是否可以使用这个包添加第五个变量 例如空间中点的大小或形状 这是我的数据和当前代码的示例
  • ggplot2、R 中的单条形条形图

    我有以下数据和代码 gt ddf var1 var2 1 aa 73 2 bb 18 3 cc 9 gt gt dput ddf structure list var1 c aa bb cc var2 c 73L 18L 9L Names
  • GGPLOT2:如何在 ggplot() 脚本中绘制特定选择

    这是一个名为的大型数据集的峰值P 其中有 10 个优惠 CS 有不同的商店 SHP 具有多个数值 数据集列出了按周排序的它们 WK 2 tm 52 它创建一个大文件 仅前 6 行出现峰值 WK MND CS SHP RevCY RevLY
  • 替换字符串/文本中“从第 n 次到最后一次”出现的单词

    这个问题以前曾被问过 但尚未得到令提问者满意的答案 https stackoverflow com questions 36368712 how to use stringrs replace all function to replace
  • 如何将 ggrough 图表另存为 .png

    说我正在使用R包裹ggrough https xvrdm github io ggrough https xvrdm github io ggrough 我有这个代码 取自该网页 library ggplot2 library ggroug
  • 非闪亮上下文中的反应式对象绑定

    实际问题 你怎样才能近似反应性环境 行为 http shiny rstudio com tutorial lesson6 建立者shiny http shiny rstudio com函数 或者甚至可能在一个函数中使用这些函数无光泽上下文以

随机推荐

  • 如何从sklearn的CCA模块获得第一个规范相关性?

    在 Python 的 scikit learn 中 有一个名为 cross decomposition 的模块 其中包含规范相关分析 CCA 类 我一直在试图弄清楚如何给出形状 n m 的 2 类多维向量并获得第一个规范相关系数 查看文档
  • Angular 2 Animate - 更改路线/组件时“* => void”过渡没有可见效果

    使用 Angular 2 Animate RC2 在官方文档的帮助下 以及 Matias 在 YT 频道上一个月前的 ng conf 动画视频中使用的代码 除了最关键的部分之外 我一切正常 更改路由器链接 组件时 我似乎无法让离开过渡 动画
  • tidyverse 未加载,它显示“命名空间‘vctrs’0.2.0 已加载,但需要 >= 0.2.1”

    强文本我在安装时不断遇到问题tidyverse包 这使我无法实现许多文本处理任务 这个问题与 2017 年以来许多以前的线程中提到的问题相同 因为当我输入library tidyverse 或者尝试打开其他相关包 他们总是说需要0 2 1版
  • 为什么二元 + 运算符不能与两个 &mut int 一起使用?

    fn increment number mut int this fails with binary operation cannot be applied to type mut int let foo number number let
  • Eclipse - java.lang.ClassNotFoundException

    当尝试从 Eclipse 中启动 JUnit Test 时 我收到 ClassNotFoundException 从控制台运行 mvn test 时 一切正常 另外 Eclipse 中也没有报告任何问题 我的项目结构如下 parent pr
  • 非静态回调如何在本机代码中工作?

    问这个问题有点奇怪 因为我的代码看起来不应该工作 但它确实工作 虽然我没有抱怨 但我想确认为什么 哈哈 简而言之 我有一个 C 本机 DLL 根本没有 CLR 托管支持 它接受来自 C 代码的回调 Native端存储了一个stdcall回调
  • 将 mySQL 查询作为 cron 作业运行?

    我想清除 SQL 数据库中超过 1 周的所有数据 并且我想每晚执行此操作 所以 我要设置一个 cron 作业 如何查询mySQL而无需每次都手动输入密码 PHP中的查询如下 mysql query DELETE FROM tbl messa
  • 将字符“00:00:00”转换为日期时间“00:00:00”

    我的问题来自这个问题 问题有以下字符串 x lt 2007 02 01 00 00 00 y lt 02 01 2007 00 06 10 如果您尝试将此字符串转换为日期类对象 则会发生一些有趣的事情 这是 nrusell 答案的示例 as
  • 如何将 na.rm 作为参数传递给 tapply?

    我想从数据框中计算平均值和标准差 其中一列用于参数 一列用于组标识符 使用时如何计算它们tapply 我可以用sd v1 group na rm TRUE 但无法适应na rm TRUE使用时进入语句tapply omit na是没有选择
  • Android 多重通知在点击时发送相同的数据

    Android 中的通知在点击时具有相同的意图 我在安装主题后发送通知 考虑我安装了 4 个主题 通知窗口中出现了 4 个通知 但是当我单击每个通知时 它将启动特定的活动 但意图是每个意图具有相同的数据 我的代码是这样的 SuppressW
  • 无法从“const wchar_t *”转换为“_TCHAR *”

    TCHAR strGroupName NULL const TCHAR strTempName NULL Assign some value to strTempName strGroupName tcschr strTempName 92
  • 管理 TPL 队列

    我有一项运行各种服务器扫描的服务 所涉及的网络可能非常庞大 数十万个网络节点 该软件的当前版本使用的是我们设计的队列 线程架构 该架构可以工作 但效率不高 尤其是因为作业可能会产生处理不好的子项 V2 即将推出 我正在考虑使用 TPL 看起
  • Java 标签不规则(可能是错误?)

    如果我们看一下Java标准 14 7 我们看到语句可能有标签前缀 例如 标签声明 标识符 声明 理论上 标签应该能够标记任何后续语句 因此 例如 以下内容将相应编译 public class Test public static void
  • OpenCV unproject 2D 指向具有已知深度“Z”的 3D

    问题陈述 我正在尝试将 2D 点重新投影到其原始 3D 坐标 假设我知道每个点的距离 继OpenCV 文档 我设法让它以零失真的方式工作 然而 当存在扭曲时 结果就不正确 目前的方法 因此 我们的想法是反转以下内容 分为以下内容 By 使用
  • 使用 jQuery 的“是”或“否”确认框

    我想要使 用 jQuery 发出 是 否 警报 而不是 确定 取消 按钮 jQuery alerts okButton Yes jQuery alerts cancelButton No jConfirm Are you sure func
  • Qt XML 中属性的顺序不正确

    我有以下代码 element clear element setTagName accountpoint element setAttribute code QString ID CONST serial element setAttrib
  • 自动构建 NuGet 包,包括引用的依赖项

    我想要运行本地 内部 NuGet 存储库 我想我已经弄清楚如何 重用 现有的 NuGet 包 方法是将它们包含在使用 NuGet 的虚拟项目中并扫描包文件以获取我的本地缓存 nupkg files but 如何创建 nuget 包 nupk
  • 将 2D 数组转换为 3D numpy 数组

    我创建了一个 numpy 数组 数组的每个元素都包含相同形状的数组 9 5 我想要的是一个 3D 数组 我尝试过使用 np stack data list map lambda x getKmers x 9 data getKmers cr
  • RabbitMQ / AMQP 中的消息组

    ActiveMQ JMS 有一个内置机制 可确保在使用竞争消费者模式时 共享公共标头 即 JMSXGroupID 标头 的消息始终由队列的同一使用者使用 队列的消费者完全不知道实际的标头值 因为具有公共标头的消息的保证是在服务器端而不是消费
  • 估计未定义表面的梯度

    我想估计一个梯度 斜率和坡向 不明确的表面 即函数未知 为了测试我的方法 这里是测试数据 require raster require rasterVis set seed 123 x lt runif 100 min 0 max 1 y