Используя ящик faer, я пытаюсь создать диагональную матрицу из вектора:
use faer::{Mat}
fn foo(
vector: &[f64],
) -> Mat<f64> {
// convert inputs to faer matrix
let vector_faer = Mat::from_fn(1, vector.len(), |_, col| vector[col]);
Mat::column_vector_as_diagonal(&vector_faer);
Несмотря на то, что ржавчина-анализатор не выдает никаких предупреждений, он паникует (см. ниже для n = 5). Что мне не хватает?
Assertion failed: self.ncols() == 1
- self.ncols() = 5
- 1 = 1
@ChayimFriedman добавил

Оказывается, я пытался использовать Mat::column_vector_as_diagonal() с вектором-строкой вместо вектора-столбца. Правильно было бы
// convert inputs to faer matrix
let vector_faer = Mat::from_fn(vector.len(), 1, |row, _| vector[row]);
Возможно, вы исправили ошибку, но бизнес-логика выглядит неправильно, поскольку вы получаете только первые n элементов вектора. Если вы хотите интерпретировать вектор как целую матрицу, а затем извлечь диагональные элементы, вы можете сделать это:
Mat::from_fn(n, n, |row, col|
if row != col { 0.0 } else { vector[col + (n*row)] }
)
Или вы можете получить диагональ в виде одного столбца по своему усмотрению:
Mat::from_fn(n, 1, |row, _|
vector[n*row + row%n]
)
Это также исправит вашу первоначальную ошибку, поэтому вы можете вызвать Mat::column_vector_as_diagonal(&vector_faer);, но не сказали, почему вы хотите это сделать.
Нет, я не хочу этого делать. У меня есть вектор 1xn, а не матрица со строками в качестве вектора. Я хочу создать из нее диагональную матрицу, а не создавать матрицу, а затем извлечь диагональ. Но я понимаю, почему вы так думаете: n = вектор.len().sqrt(), который работает для матриц nxn, — это всего лишь остаток исходного кода, когда я писал этот репрекс. Спасибо, я это отредактировал.
В чем заключается паническое послание? Обратный след?