Диагональная матрица из вектора

Используя ящик 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

В чем заключается паническое послание? Обратный след?

Chayim Friedman 17.06.2024 17:18

@ChayimFriedman добавил

Alberson Miranda 17.06.2024 17:24
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Оказывается, я пытался использовать 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, — это всего лишь остаток исходного кода, когда я писал этот репрекс. Спасибо, я это отредактировал.

Alberson Miranda 17.06.2024 21:30

Другие вопросы по теме