有没有一种方法可以在Math.Net上支持0x0矩阵?

时间:2019-05-24 13:27:14

标签: c# math.net

我正在使用Matrix Nx2来存储形成多边形的点的列表。

例如,我有一个函数返回一个子矩阵Nx2,该子矩阵Nx2包含一个点,这些点位于带有简单方程y = 6的直线上方。

问题是:有时子矩阵将没有点。

然后我想做类似的事情:

using MathNet.Numerics.LinearAlgebra.Double;
double[,] pontos = { { }, { } };
Matrix mat = DenseMatrix.OfArray(pontos);

有没有一种方法可以支持0x0矩阵并使Matrix.RowCount == 0?

谢谢

大卫

1 个答案:

答案 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:矩阵的行数必须为正。