Как правильно конвертировать из nalgebra :: Matrix в Eigen :: MatrixXf? - PullRequest
0 голосов
/ 30 апреля 2020

У меня DLL написано в C++, и мне нужно вызвать функцию с именем print_matrix(Eigen::MatrixXf *m) из программы на Rust.

Я создал mactrix 4x3, и рассматриваемая функция получает указатель в качестве входного параметра.

Код ржавчины:

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).

У вас есть идеи, почему это происходит? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...