- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是从 cpp 文件的 numDeriv
R
包中调用 hessian()
函数(使用 Rcpp
)。
一个玩具示例:
我想计算参数 n=3 的一维函数 x^n 在点 x=1 处的粗麻布矩阵。
R代码:
H = call_1D_hessian_in_C(K=1)
print(H)
Cpp代码:
double one_dimensional(double X, double N){
return pow(X,N);
}
// [[Rcpp::export]]
double call_1D_hessian_in_C(double K) {
Rcpp::Environment numDeriv("package:numDeriv");
Rcpp::Function hessian = numDeriv["hessian"];
double param = 3;
Rcpp::List hessian_results =
hessian(
Rcpp::_["func"] = Rcpp::InternalFunction(one_dimensional),
Rcpp::_["x"] = 1.0,
Rcpp::_["N"] = param
);
return hessian_results[0];
}
这工作正常,我确实在输出中得到“6”。
然而,我的真正目标是计算 K 维函数的粗麻布矩阵,因此 K=/=1。我尝试以下操作:
H = call_KD_hessian_in_C(K=2)
print(H)
在 Cpp 中:
NumericVector k_dimensional(NumericVector X, double N){
return pow(X,N);
}
// [[Rcpp::export]]
double call_KD_hessian_in_C(double K) {
Rcpp::Environment numDeriv("package:numDeriv");
Rcpp::Function hessian = numDeriv["hessian"];
double param = 3;
Rcpp::NumericVector x = rep(1.0,K);
Rcpp::List hessian_results =
hessian(
Rcpp::_["func"] = Rcpp::InternalFunction(k_dimensional),
Rcpp::_["x"] = x,
Rcpp::_["N"] = param
);
return hessian_results[0];
}
但现在我收到“无效指针”错误。我不确定如何为 hessian 函数调用提供 cpp 函数,该函数采用一组参数来评估...
最佳答案
几个快速笔记:
numDeriv
包。X
与 x
。?numDeriv::hessian
,输出类型是 N x N Rcpp::NumericMatrix
而不是 Rcpp::List
。<编写示例并在 pure R 中运行它会给出:
k = 2
k_dimensional = function(x, N) {
x ^ N
}
numDeriv::hessian(k_dimensional, x = rep(1, k), N = 3)
Error in hessian.default(k_dimensional, x = rep(1, k), N = 3) :
Richardson method for hessian assumes a scalar valued function.
因此,这立即意味着 k_dimensional()
函数缺少对标量的缩减(例如单个值)。
编译原始代码后,出现运行时错误或调用函数时出现问题。例如,我们有:
Rcpp::sourceCpp("path/to/call_KD_hessian_in_C.cpp")
call_KD_hessian_in_C(K = 2)
这提供了以下错误:
Error in call_KD_hessian_in_C(2) :
Cannot convert object to an environment: [type=character; target=ENVSXP].
由于我们正在使用在默认情况下未加载的包中找到的 R 函数,因此我们必须通过 library()
或 require()< 显式加载它
在调用函数之前。
因此,避免环境问题的过程应该是:
# Compile the routine
Rcpp::sourceCpp("path/to/call_KD_hessian_in_C.cpp")
# Load numDeriv to ensure it is on the search path
library("numDeriv")
# Call function
call_KD_hessian_in_C(2)
根据之前的讨论,请注意我们已经:
double
,而不是值 vector ,例如NumericVector
.numDeriv
R 包。 hessian()
函数的预期返回类型从 Rcpp::List
更改为 Rcpp::NumericMatrix
。这导致以下 C++ 代码:
#include <Rcpp.h>
double k_dimensional_cpp(Rcpp::NumericVector x, double N){
// ^^ Change return type from NumericVector to double
// Speed up the process by writing the _C++_ loop
// instead of relying on Rcpp sugar.
double total = 0;
for(int i = 0 ; i < x.size(); ++i) {
total += std::pow(x[i], N);
}
// Return the accumulated total
return total;
}
// [[Rcpp::export]]
Rcpp::NumericMatrix call_KD_hessian_in_C(double K) {
// Ensure that numDeriv package is loaded prior to calling this function
Rcpp::Environment numDeriv("package:numDeriv");
Rcpp::Function hessian = numDeriv["hessian"];
double param = 3;
Rcpp::NumericVector x = Rcpp::rep(1.0, K);
// Switched from Rcpp::List to Rcpp::NumericMatrix
Rcpp::NumericMatrix hessian_results =
hessian(
Rcpp::_["func"] = Rcpp::InternalFunction(k_dimensional_cpp),
Rcpp::_["x"] = x, // use lower case x to match function signature.
Rcpp::_["N"] = param
);
// Return the calculated hessian
return hessian_results;
}
测试例程给出:
# Ensure numDeriv is on search path
library("numDeriv")
# Call function
call_KD_hessian_in_C(K = 2)
# [,1] [,2]
# [1,] 6.000000e+00 3.162714e-12
# [2,] 3.162714e-12 6.000000e+00
关于c++ - 调用 numDeriv :hessian() with multiple-parameter-objective-function in Rcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55265496/
我有一个需要良好二进制协议(protocol)的新项目。 我正在考虑使用 Hessian ,除非有人有更好的想法。 我正在阅读他们的一些文档,但它并不像我想象的那么简单,所以我有几个简单的问题。 主页
当我们需要计算双梯度或Hessian时,在tensorflow中,我们可以使用tf.hessians(F(x),x) ,或使用tf.gradient(tf.gradients(F(x),x)[0],
我正在尝试在两个 Android 设备之间建立基本的 Hessian 通信。 Client 发送消息的AsyncTask public class AsyncHessian extends Async
1、hessian是什么? 看到这个单词我还不知道怎么读,音标是[hes]读黑森。 Hessian是一个轻量级的远程的数据交换工具,使用简单的方法提供了RMI(远程方法调用
如何使用 Hessian 二进制协议(protocol)创建文件上传/下载 servlet?对于大于 1GB 的文件。我为 Hessian with large binary data 创建测试, 但
我们正在将生产环境转移到客户的数据中心。目前,为了解释该场景,我们有一个 Apache 负载均衡器,它对托管 2 个 Grails 应用程序的 2 个 Apache Tomcat 应用程序服务器的请求
Hessian 协议(protocol)有超时吗? 注意:我没有使用 Hessian4J。相反,我使用 Spring 导出 Hessian 服务,并使用我自己的代码来处理 Hessian 请求。 最佳
我正在使用 Hessian 调用 Java 方法,是否还可以在发送消息之前添加 HTTP header - 这样我就可以将“授权”添加到消息 header 中? 我正在使用 Spring,因此我当前获
已关注 writing hessian serivce我已经在我的 Spring 应用程序中设置了 Hessian Web 服务及其工作。 使用 org.springframework.remotin
我想提取血管中的中心线像素。起初我使用 ginput(1) 命令选择了靠近容器边缘的种子点。这提供了起点并指定了需要执行分析的血管段上的感兴趣区域 (ROI)。 figure; imshow(Igre
有没有办法在SAS的proc逻辑中获得Hessian矩阵?或者哪个是从 proc logitic 开始计算它的选项? 我一直在阅读函数文档,但看不到有办法将它包含在输出表中。 最佳答案 我搜索了 SA
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我必须调用 Hessian 服务来获取大量数据,该服务非常慢。因为 Hessian 调用不会更新数据,结果也很少改变。我想知道是否可以在预定义的时间内根据服务名称和参数缓存结果。我将 Hessian
在使用 scipy.optimize.minimize 和 trust-constr 方法时,我得到了这个 UserWarning: scipy\optimize\_hessian_update_s
Hessian 的官方 J2ME 实现似乎有严重的局限性:不支持复杂的对象。 在线文档中没有提到这个局限性,但是如果你谷歌“hessian j2me”你会找到关于这个的帖子问题。虽然谷歌没有找到解决方
我正在使用牛顿法实现回归的梯度下降,如《机器学习概率视角》(Murphy)一书中的 8.3 部分所述。我在此实现中使用二维数据。我正在使用以下符号。 x = 输入数据点 m*2 y = 对应于输入数据
我正在研究处理从 Spring Hessian 连接中断中恢复的方法。如果连接断开,Hessian 代理可能抛出哪些异常? 最佳答案 这是一个示例堆栈跟踪,每次您尝试连接到不可用的 Hessian 远
我有一个 Java 1.4 网络应用程序,它使用 Hessian 来进行网络服务调用。我试图将它写得尽可能健壮和透明。在调用代理时,我不希望任何 hessian 异常使其脱离我的委托(delegate
我正在使用 spring 3.1.0、com.springsource.com.caucho-3.2.1.jar 和 tomcat-6.0.33 双方(客户端/服务器)。除了长时间接受服务(超过 9/
我有一个张量 X,大小为 M x D。我们可以将 X 的每一行解释为训练样本,将每一列解释为一个特征。 X 用于计算大小为 M x 1 的张量 u(换句话说,u 依赖于计算图中的 X)。我们可以将其解
我是一名优秀的程序员,十分优秀!