Rust: ошибка «несколько применимых элементов в области» для продукта ndarray dot на срезе - PullRequest
1 голос
/ 20 апреля 2020

Я думаю, что я в конечном итоге придумал решение, задавая этот вопрос, но решил, что все равно оставлю вопрос ...

Я работаю с n-мерными матрицами, используя ящик ndarray и Мне нужно взять точечные продукты из нескольких несмежных срезов. Однако я столкнулся с проблемой, поскольку компилятор не может понять, являются ли мои срезы 1D или 2D, когда дело доходит до точечного продукта, и я не уверен, как указать эту информацию.

Вот упрощенный пример:

use ndarray::prelude::*;

fn main() {

    let a = array![[1, 2, 3], [1, 2, 3]];
    println!("{:?}", &a);

    let b = array![[1, 2, 3], [1, 2, 3]];
    println!("{:?}", &b);

    let a_slice = a.slice(s![0, ..]);
    let b_slice = b.slice(s![0, ..]);

    println!("{:?}", &a_slice.dot(&b_slice));

}

Сообщение об ошибке немного сбивает с толку, и я не знаю, как заставить точечный продукт использовать правильного кандидата с учетом задействованных абстрактных структур:

error[E0034]: multiple applicable items in scope
  --> src/main.rs:14:31
   |
14 |     println!("{:?}", &a_slice.dot(&b_slice));
   |                               ^^^ multiple `dot` found
   |
   = note: candidate #1 is defined in an impl for the type `ndarray::ArrayBase<_, ndarray::dimension::dim::Dim<[usize; 1]>>`
   = note: candidate #2 is defined in an impl for the type `ndarray::ArrayBase<_, ndarray::dimension::dim::Dim<[usize; 2]>>`

Как мне предоставить необходимую информацию?

1 Ответ

0 голосов
/ 20 апреля 2020

Несмотря на сообщение об ошибке, относящееся к ArrayBase, важной частью информации здесь фактически являются размеры среза. Таким образом, предоставление явных размеров с использованием ArrayView делает свое дело:

use ndarray::prelude::*;

fn main() {

    let a = array![[1, 2, 3], [1, 2, 3]];
    println!("{:?}", &a);

    let b = array![[1, 2, 3], [1, 2, 3]];
    println!("{:?}", &b);

    let a_slice: ArrayView<_, Ix1> = a.slice(s![0, ..]);
    let b_slice: ArrayView<_, Ix1> = b.slice(s![0, ..]);

    println!("{:?}", &a_slice.dot(&b_slice));

}
...