- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
简而言之,问题是如何通过一个
Eigen::Map<Eigen::MatrixXd>
反对一个期待一个函数
Eigen::MatrixXd
对象。
长话短说:
我有这个 C++ 函数声明
void npMatrix(const Eigen::MatrixXd &data, Eigen::MatrixXd &result);
连同这个实现
void npMatrix(const Eigen::MatrixXd &data, Eigen::MatrixXd &result)
{
//Just do s.th. with arguments
std::cout << data << std::endl;
result(1,1) = -5;
std::cout << result << std::endl;
}
我想使用 numpy.array 作为参数从 python 调用这个函数。为此,我使用了一个用 c++ 编写的包装器函数
void pyMatrix(const double* p_data, const int dimData[],
double* p_result, const int dimResult[]);
它接受一个指向数据的指针、数据数组的大小、一个指向结果的指针和结果数组的大小。数据指针指向内存的 const 补丁,因为当为结果保留的内存补丁是可写的时,数据不会被更改。函数的实现
void pyMatrix(const double *p_data, const int dimData[], double *p_result, const int dimResult[])
{
Eigen::Map<const Eigen::MatrixXd> dataMap(p_data, dimData[0], dimData[1]);
Eigen::Map<Eigen::MatrixXd> resultMap(p_result, dimResult[0], dimResult[1]);
resultMap(0,0) = 100;
npMatrix(dataMap, resultMap);
}
分别为数据和结果定义一个 Eigen::Map。 Eigen::Map 允许作为一种 Eigen::Matrix 访问原始内存。 dataMap是类型
<const Eigen::MatrixXd>
因为关联的内存是只读的; resultMap 相比之下是类型
<Eigen::MatrixXd>
因为它必须是可写的。线路
resultMap(0,0) = 100;
表明,resultMap 实际上是可写的。在将 dataMap 传递给预期 const Eigen::MatrixXd 起作用的 npMatrix() 时,我找不到以相同方式传递 resultMap 的方法。我敢肯定,麻烦来自于 npMatrix 的第一个参数是 const,而第二个不是。我找到的一个可能的解决方案是定义
Eigen::MatrixXd resultMatrix = resultMap;
并将此 resutlMatrix 传递给 npMatrix()。但是,我猜,这会创建一个拷贝,因此会破坏 Eigen::Map 的良好内存映射。所以我的问题是。
有没有办法将 Eigen:Map 传递给需要非常量 Eigen::MatrixXd 的函数?
附带说明:我可以将 npMatrix 更改为期望 Eigen::Map,但由于在实际项目中,函数已经存在并经过测试,我宁愿不对它们进行调整。
为了完成这个问题,这里是调用 pyMatrix() 的 python 文件
import ctypes as ct
import numpy as np
import matplotlib.pyplot as plt
# Load libfit and define input types
ct.cdll.LoadLibrary("/home/wmader/Methods/fdmb-refactor/build/pyinterface/libpyfit.so")
libfit = ct.CDLL("libpyfit.so")
libfit.pyMatrix.argtypes = [np.ctypeslib.ndpointer(dtype=np.float64, ndim=2),
np.ctypeslib.ndpointer(dtype=np.int32, ndim=1),
np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, flags='WRITEABLE'),
np.ctypeslib.ndpointer(dtype=np.int32, ndim=1)
]
data = np.array(np.random.randn(10, 2), dtype=np.float64, order='F')
result = np.zeros_like(data, dtype=np.float64, order='F')
libfit.pyMatrix(data, np.array(data.shape, dtype=np.int32),
result, np.array(result.shape, dtype=np.int32))
最佳答案
将其作为指向数据的普通指针传递,然后 Eigen::Map 将其映射到那里。或者,使用 template <typename Derived>
等等,在 http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html 中找到不过,我个人的选择是第一个,因为最好是拥有不暴露您使用的每个 API 的所有顽固性的代码。此外,您不会失去与 eigen 的兼容性,也不会与您(或其他任何人)以后可能使用的任何其他类型的库失去兼容性。
我还发现了另一个技巧,可以在很多场合使用:
Eigen::MatrixXd a;
//lets assume a data pointer like double* DATA that we want to map
//Now we do
new (&a) Eigen::Map<Eigen::Matrix<Double,Eigen::Dynamic,Eigen::Dynamic>> (DATA,DATA rows,DATA cols);
这将按照您的要求进行操作,而不会浪费内存。我认为这是一个很酷的技巧,a
将表现为 matrixXd,但我没有测试过每一个场合。 它没有内存拷贝。但是,您可能需要调整大小 a
在分配之前调整到合适的大小。即便如此,编译器不会在您请求 resize
时立即分配所有内存。操作,所以也不会有大量无用的内存分配!
Be careful! Resizing operations might reallocate the memory used by an eigen matrix! So, if you ::Map a memory but then you perform an action that resizes the matrix, it might be mapped to a different place in memory.
关于c++ - 使用 Eigen::Map<Eigen::MatrixXd> 作为 Eigen::MatrixXd 类型的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587893/
我有一个下三角 MatrixXd,我想将其较低的值复制到上边,因为它将成为一个对称矩阵。我该怎么做? 到目前为止我已经完成了: MatrixXd m(n,n); ..... //do somet
简而言之,问题是如何通过一个 Eigen::Map 反对一个期待一个函数 Eigen::MatrixXd 对象。 长话短说: 我有这个 C++ 函数声明 void npMatrix(const Eig
我的问题很简单,希望也有一个很好的答案:当我构造了 Eigen::MatrixXd 矩阵时,我可以使用多个线程同时填充矩阵中的行吗(如果我可以确保没有行被同时写入),或者我必须在每个线程中创建临时行对
是否有任何可能的方法来创建一个 Eigen::MatrixXd 矩阵的 View ,其中索引被排列?例如,如果 View 名为 matView 而原始矩阵名为 mat,那么 matView(i,j)
我正在创建一个类,它应该有一个矩阵作为在 Eigen 库的 MatrixXd 类型的 header 类中声明的 protected 成员。问题是,如果我将它声明为 MatrixXd name(5, 5
用具有 long double 的 vector 和矩阵替换所有 Eigen::MatrixXd 和 Eigen::VectorXd 的最简单方法是什么> 元素? 我代码中的每个基本浮点变量都是 lo
我正在尝试遍历 Eigen::MatrixXd 矩阵。但是,似乎没有返回列大小或行大小的函数。有人知道如何执行此操作吗? 最佳答案 这应该可以... #include int main() {
我有一个不断增长的Eigen::MatrixXd 形式的数据库。我的矩阵开始为空,然后逐行添加行,直到达到最大预定义(编译时已知)行数。 目前我是这样培养它的(来自 Eigen 文档以及此处和其他地方
我需要以类似 3D 的结构存储数据,但是我一直依赖 Eigen 库来处理代码中的矩阵结构,而 Eigen 不提供 3D 矩阵。我发现了两种可能的解决方法: int x,y,z; Eigen::Ma
也许有人知道,Eigen中是否可以转发声明类型MatrixXd & VectorXd? 编译时出现如下错误: /usr/include/eigen3/Eigen/src/Core/Matrix.h:3
我正在处理一些大型数据集,其中复数矩阵的实部和虚部分别存储在一个文件中,我想从此类数据创建一个 Eigen::MatrixXcd: // read data, note that real an
我一直在尝试在 Eigen 库的帮助下重建输入到我用 C++ 编写的 RBM 程序的输入数据。但是为了将重建矩阵的矩阵元素保持在某个特定范围内,我需要对它们应用一个 sigmoid 函数。当我这样做时
我想将 Eigen::ArrayXXd 类型的数组移动(或交换)到 Eigen::MatrixXd。为此,我尝试了, #include #include using namespace std;
Eigen 是一个众所周知的 c++ 矩阵库。我无法找到一个内置函数来简单地将一个项目推到矩阵的末尾。目前我知道可以这样做: Eigen::MatrixXd matrix(10, 3); long i
我需要使用 RcppEigen 反转 MatrixXd 的列顺序。 在 R 中我会简单地做 > M = matrix(1:9, ncol = 3) > M [,1] [,2] [,3] [1
我正在开发一个需要一些非常快的矩阵乘法的包,所以希望使用 RcppEigen .出于各种原因,尽管与多维数组的需要有关,但我需要将类 Eigen::MatrixXd 的创建对象转换为类 Rcpp::N
在我的示例中,我得到了一些形成立方体的点并存储在 Eigen::MatrixXd 容器中,例如: // Inline mesh of a cube const Eigen::MatrixXd
如何将 ArrayXXd 数组转换为 MatrixXd?到目前为止,我已经完成了 MatrixXd temp_mat = my_array; 并且隐式转换似乎工作正常,但这是应该完成的方式吗?或者我应
我想使用 MPI 在机器之间发送矩阵。以下是我的测试代码 #include #include #include using std::cin; using std::cout; using st
我正在编写一个库,将 Eigen 表达式模板存储为成员变量,以执行它需要执行的复杂计算。但是,似乎我无法存储或返回这些表达式模板,除非它们在 MatrixXd 或类似工具中直接转换。这迫使每一步都临时
我是一名优秀的程序员,十分优秀!