Есть ли способ поддержать 0x0 Matrix на Math.Net?
Я использую матрицу Nx2 для хранения списка точек, которые образуют многоугольник.
У меня есть функция, которая возвращает подматрицу Nx2, содержащую точки над линией с простым уравнением, например, y = 6.
Проблема в том, что иногда у подматрицы не будет точек.
Тогда я хочу сделать что-то вроде:
using MathNet.Numerics.LinearAlgebra.Double;
double[,] pontos = { { }, { } };
Matrix mat = DenseMatrix.OfArray(pontos);
Есть ли способ поддержать матрицу 0x0 и иметь Matrix.RowCount == 0?
Спасибо,
Дэвид
0 ответов
То, что вы ищете, невозможно. При создании любыхMatrix
MathNet
всегда приходит к созданию MatrixStorage
с конструктором:
// MathNet.Numerics.LinearAlgebra.Storage.MatrixStorage<T>
using MathNet.Numerics.Properties;
using System;
using System.Runtime.Serialization;
protected MatrixStorage(int rowCount, int columnCount)
{
if (rowCount <= 0)
{
throw new ArgumentOutOfRangeException("rowCount", Resources.MatrixRowsMustBePositive);
}
if (columnCount <= 0)
{
throw new ArgumentOutOfRangeException("columnCount", Resources.MatrixColumnsMustBePositive);
}
RowCount = rowCount;
ColumnCount = columnCount;
}
Так как видно не 0x0 Matrix
возможно с MathNet
.
Обновить:
Можно сделать такой взлом:
static class EmptyDenseMatrix
{
public static DenseMatrix Create()
{
var storage = DenseColumnMajorMatrixStorage<double>.OfArray(new double[1, 1]);
var type = typeof(DenseColumnMajorMatrixStorage<double>);
type.GetField("RowCount").SetValue(storage, 0);
type.GetField("ColumnCount").SetValue(storage, 0);
type.GetField("Data").SetValue(storage, new double[0]);
return new DenseMatrix(storage);
}
}
Применение:
Console.WriteLine(EmptyDenseMatrix.Create());
Дает:
DenseMatrix 0x0-Double
Но нет ничего значимого, что вы можете сделать с такой матрицей внутри MathNet
, например
Console.WriteLine(EmptyDenseMatrix.Create()* EmptyDenseMatrix.Create());
Дает:
System.ArgumentOutOfRangeException: количество строк матрицы должно быть положительным.