Могу ли я изменить матрицу в MathNet Numerics Library на массив?

Я работаю над программой, которая нуждается в матричной операции. Я решил использовать Math.NET Numerics библиотека. у меня есть Matrix и я хочу изменить одно из его значений, но я не знаю как. У меня вопрос, можем ли мы иметь Matrix как array? Можем ли мы преобразовать Matrix в array? Я осмотрел AsArray Метод в этой библиотеке, но возвращаемое значение было нулевым.

1 ответ

Matrix<T> (который является базовым типом для всех остальных MathNet matrix-types) предоставляет индексатор public T this[int row, int column] { get; set; }, Таким образом, вы можете использовать его для изменения значений элементов.

using MathNet.Numerics.LinearAlgebra.Double;
// ...
var matrix = DenseMatrix.Create(2, 2, 0);
Console.WriteLine(matrix);
matrix[1, 1] = 1;
Console.WriteLine(matrix);

дает:

DenseMatrix 2x2-Double
0  0
0  0

DenseMatrix 2x2-Double
0  0
0  1

Превратить Matrix<T> в T[,] использование ToArray() вместо AsArray(),

MathNet документация говорит, что AsArray()

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

В то время какToArray()

Возвращает эту матрицу в виде многомерного массива. Возвращенный массив будет независим от этой матрицы. Новый блок памяти будет выделен для массива.


Обновить:

Выглядит какAsArray() не работает вообще. С участием var data = new[,] { { 1d, 1d }, { 1d, 1d } }new DenseMatrix(DenseColumnMajorMatrixStorage<double>.OfArray(data)).AsArray()возвращаетсяnull, Так жеDenseMatrix.OfArray(data).AsArray(),


Update2:

Проверено сILSpy,

MathNet.Numerics.LinearAlgebra.Matrix:

/// <summary>
/// Returns the internal multidimensional array of this matrix if, and only if, this matrix is stored by such an array internally.
/// Otherwise returns null. Changes to the returned array and the matrix will affect each other.
/// Use ToArray instead if you always need an independent array.
/// </summary>
public T[,] AsArray()
{
    return Storage.AsArray();
}

MathNet.Numerics.LinearAlgebra.Storage.MatrixStorage:

public virtual T[,] AsArray()
{
    return null;
}

Matrix<T>.AsArray() ВСЕГДА возвращаетсяnull,

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