如何正确地从nalgebra::Matrix转换为Eigen::MatrixXf



我有一个用C++编写的DLL,我需要从Rust程序中调用一个名为print_matrix(Eigen::MatrixXf *m)的函数。

我创建了一个4x3的mactrix,这个函数的输入参数是指针。

锈蚀代码:

use nalgebra::Matrix;
pub type MatrixX = Matrix<f32, Dynamic, Dynamic, VecStorage<f32, Dynamic, Dynamic>>;
pub fn main() {
match call_dynamic() {
Ok(_) => println!("Func ok",),
Err(e) => println!("{:?}", e),
}
}
pub fn call_dynamic() -> Result<(), Box<dyn std::error::Error>> {
let lib = dll::Library::new("MyDLL.dll")?;
unsafe {
let func: dll::Symbol<fn(*mut MatrixX)> = lib.get(b"print_matrix")?;
func(init_cube());
Ok(())
}
}
// Init matrix and return raw pointer
pub fn init_matrix() -> *mut MatrixX {
let points: MatrixX = DMatrix::from_row_slice(
4,
3,
&[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0],
);
Box::into_raw(Box::new(points))
}

C++代码:

extern "C" __declspec(dllexport) void print_matrix(Eigen::MatrixXf *m);
void print_matrix(Eigen::MatrixXf* m) {
using namespace Eigen;
using namespace std;
// Print size of a matrix
std::cout << "m->size() : " << m->size() << std::endl;
// Print number of rows
std::cout << "m->rows() : " << m->rows() << std::endl;
// Print number of columns 
std::cout << "m->cols() : " << m->cols() << std::endl;
// Print first column
std::cout << "m->col(0) : " << m->col(0) << std::endl;
}

我的输出是这样的:

m->size() : 144
m->rows() : 12
m->cols() : 12
m->col(0) : 
0
0
0
0
0
0
1
1
0
1
0
1

但我不明白为什么m->rows() = 12的输出和这个等于rows * cols (4 * 3)

你知道为什么会这样吗?非常感谢。

我没有发现nalgebra矩阵与特征矩阵兼容,而是使用Array将数据传递给特征矩阵。

C++代码:

// Create Eigen::Matrix
void* create_matrix(size_t rows, size_t cols, int points[]) {
// Init pointer
Eigen::MatrixXi* M;
M = new Eigen::MatrixXi;
Map<Eigen::MatrixXi, Unaligned, Stride<1, 3> > Temp_M(points, rows, cols);
*M = Temp_M;
return M;
}
// Print Matrix
void print_matrix(Eigen::MatrixXi* M) {
cout << *M << std::endl;
}

锈蚀代码:

// Get pointer to the function
let create_matrix: dll::Symbol<fn(usize, usize, *mut i32) -> *mut u8> =
lib.get(b"create_matrix")?;
// Store pointer to Matrix
let m_ptr = create_matrix(2, 2, [1, 2, 3, 4].as_mut_ptr());
let print_matrix: dll::Symbol<fn(*mut u8)> =
lib.get(b"print_matrix")?;
print_matrix(m_ptr);

最新更新