Как мне создать структуру, содержащую матрицу налгебры с более высокими измерениями? - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу создать struct, который содержит nalgebra::MatrixN, который U1 больше:

extern crate nalgebra as na;

use na::{DimName, DimNameAdd, DimNameSum, MatrixN, U1};

pub struct Homogenous<D: DimName>
where
    D: DimNameAdd<U1>,
{
    mat: na::MatrixN<f32, DimNameSum<D, U1>>,
}

Я получаю следующую ошибку:

error[E0277]: cannot multiply `<<D as na::DimNameAdd<na::U1>>::Output as na::DimName>::Value` to `<<D as na::DimNameAdd<na::U1>>::Output as na::DimName>::Value`
 --> src/main.rs:9:5
  |
9 |     mat: na::MatrixN<f32, DimNameSum<D, U1>>,
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `<<D as na::DimNameAdd<na::U1>>::Output as na::DimName>::Value * <<D as na::DimNameAdd<na::U1>>::Output as na::DimName>::Value`
  |
  = help: the trait `std::ops::Mul` is not implemented for `<<D as na::DimNameAdd<na::U1>>::Output as na::DimName>::Value`
  = help: consider adding a `where <<D as na::DimNameAdd<na::U1>>::Output as na::DimName>::Value: std::ops::Mul` bound
  = note: required because of the requirements on the impl of `na::allocator::Allocator<f32, <D as na::DimNameAdd<na::U1>>::Output, <D as na::DimNameAdd<na::U1>>::Output>` for `na::DefaultAllocator`

Попытка следовать сообщению об ошибке приводит к кроличьей норе с сообщением об ошибке следующего признака. Я посмотрел на API nalgebra, который не содержит таких сложных цепочек признаков. Например, метод to_homogenous. Я не уверен, что мой подход даже правильный.

Существует также черта Dim с соответствующими DimAdd и DimSum, однако, поскольку эта часть nalgebra на самом деле не задокументирована,

Я не знаю, нахожусь ли я на правильном пути - или возможно ли то, что я хочу сделать.

1 Ответ

0 голосов
/ 12 ноября 2018

Этот пост указал мне правильное направление. Способ сделать это в nalgebra немного запутан:

extern crate nalgebra as na;

use crate::na::{Dim, DimName, DimNameAdd, DimNameSum, MatrixN, U1, DefaultAllocator};
use crate::na::allocator::Allocator;

pub struct Homogenous<D: Dim + DimName>
where
    D: DimNameAdd<U1>,
    DefaultAllocator: Allocator<f32, DimNameSum<D, U1>, DimNameSum<D, U1>>,
{
    mat: MatrixN<f32, DimNameSum<D, U1>>,
}

Надеемся, что этот тип универсальных манипуляций станет более эргономичным в будущих версиях Rust и nalgebra, поскольку эти довольно громоздкие аннотации типов необходимо повторять довольно часто.

Кстати, просто для хранения этих универсальных типов в структуре все еще требуется DefaultAllocator:

extern crate nalgebra as na;

use crate::na::{Dim, DimName, MatrixN, DefaultAllocator};
use crate::na::allocator::Allocator;

pub struct Homogenous<D: Dim + DimName>
where
    DefaultAllocator: Allocator<f32, D, D>,
{
    mat: MatrixN<f32, D>,
}
...