gpt4 book ai didi

c++ - 如何正确地从nalgebra::Matrix转换为Eigen::MatrixXf?

转载 作者:行者123 更新时间:2023-12-02 10:17:17 26 4
gpt4 key购买 nike

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

我创建了一个4x3的Mactrix,所讨论的函数将指针作为其输入参数。

rust 代码:

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)的输出。

你知道为什么会这样吗?
谢谢!

最佳答案

我没有发现纳代尔矩阵与 Eigen 矩阵兼容,而是使用Array将数据传递到 Eigen 矩阵。

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;
}

防 rust 码:

// 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);

关于c++ - 如何正确地从nalgebra::Matrix转换为Eigen::MatrixXf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61513304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com