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

问题描述 投票:1回答:1

我有一个 DLL 写在 C++ 而我需要调用一个叫做 print_matrix(Eigen::MatrixXf *m) 从一个Rust程序中获取。

我创建了一个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).

你知道为什么会出现这种情况吗?

c++ rust eigen nalgebra
1个回答
1
投票

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

C++代码: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);
© www.soinside.com 2019 - 2024. All rights reserved.