Могу ли я изменить матрицу в 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
,