我正在使用Matrix Nx2来存储形成多边形的点的列表。
例如,我有一个函数返回一个子矩阵Nx2,该子矩阵Nx2包含一个点,这些点位于带有简单方程y = 6的直线上方。
问题是:有时子矩阵将没有点。
然后我想做类似的事情:
using MathNet.Numerics.LinearAlgebra.Double;
double[,] pontos = { { }, { } };
Matrix mat = DenseMatrix.OfArray(pontos);
有没有一种方法可以支持0x0矩阵并使Matrix.RowCount == 0?
谢谢
大卫
答案 0 :(得分:1)
您要找的东西是不可能的。创建任何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;
}
因此,Matrix
不可能提供0x0 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:矩阵的行数必须为正。