Math.net如何创建通用的ToString()覆盖

时间:2015-11-21 11:54:42

标签: c# mathdotnet

Math.net对大多数数据集合都有ToString()个实现。在课堂上使用时,需要重写这些内容。我知道如何为一个变量做这个,但是如何使它对所有相同类型的变量都是通用的?

我的一个变量ToString()的类定义覆盖:

public class Network
{
    public Matrix<double> Win { get; set; }         // network input matrix
    public Matrix<double> Wres { get; set; }        // network reservoir matrix
    public Matrix<double> Wout { get; set; }        // network output matrix

    // constructor
    public Network(Matrix<double> Winput, Matrix<double> Wreservoir, Matrix<double> Woutput)
    {
        Win = Winput;
        Wres = Wreservoir;
        Wout = Woutput;
    }

    public override string ToString()
    {
        return Win.ToString();
    }
}

这适用于Win Console.WriteLine(network.Win.ToString());之类的调用,但如何输出其他矩阵WresWout(具有不同的维度)?我试图创建三个覆盖,但这不起作用,因为编译器抱怨:

  

已经使用相同的参数定义了一个名为'ToString'的成员   类型

此外,我确信必须有更通用和更优雅的方式来做到这一点。

2 个答案:

答案 0 :(得分:2)

您已在Matrix课程中将每个Network创建为公共媒体资源,因此您可以在需要时轻松访问它们。

Network network = new Network(mInput, mResevoir, mOutput);

Console.WriteLine(network.Win);
Console.WriteLine(network.Wres);
Console.WriteLine(network.Wout);

编辑:我刚刚意识到属性也有一个公共集方法。如果您不希望在创建网络变量后更改属性,则可以将setter修改为private,因此值只能来自类中。

public class Network
{           
    public Matrix<double> Win { get; private set; }         // network input matrix
    public Matrix<double> Wres { get; private set; }        // network reservoir matrix
    public Matrix<double> Wout { get; private set; }        // network output matrix

    // constructor
    public Network(Matrix<double> Winput, Matrix<double> Wreservoir, Matrix<double> Woutput)
    {
        Win = Winput;
        Wres = Wreservoir;
        Wout = Woutput;
    }

    public override string ToString()
    {
        return Win.ToString();
    }
}

答案 1 :(得分:0)

您创建的ToString()方法适用于Network类...

换句话说,你已经将Network.ToString()作为字符串化的Win矩阵。当然,Network.ToString()你不能有三种不同的行为 - 所以你想要它做什么?

认为你的问题试图覆盖网络类上所有Matrix字段的network.matrix.ToString()行为......在这种情况下,有必要覆盖Matrix类的行为要做到这一点,您需要使用Win替换WresWoutMatrix<double>子类ToString()覆盖:

public class Network
{
    public NetworkMatrix Win { get; set; }         // network input matrix
    public NetworkMatrix Wres { get; set; }        // network reservoir matrix
    public NetworkMatrix Wout { get; set; }        // network output matrix

    // constructor
    public Network(NetworkMatrix Winput, NetworkMatrix Wreservoir, NetworkMatrix Woutput)
    {
        Win = Winput;
        Wres = Wreservoir;
        Wout = Woutput;
    }

    ...
}

public class NetworkMatrix : Matrix<double>
{
    public override string ToString()
    {
        return "Overwridden tostring method.";
    }
}

根据您为构造函数提供的方式,可能无法在派生类型中发送。另外,我还没有NetworkMatrix通用,但如果您愿意,可以NetworkMatrix<T> : Matrix<T>

说了这么多 - 我应该指出,调用像network.Win.ToString()这样的东西通常是编码实践很差 - 其他类不应该知道网络的内部并且你会遇到问题。查看得墨忒耳定律(例如https://en.wikipedia.org/wiki/Law_of_Demeter)以获取更多信息。 (特别值得一提的是,WinWres甚至Wout是否应该首先公开?)

最好的方法是使用覆盖Network.ToString()方法以合理的方式组合Win,Wres或Wout上的数据。或者创建一个矩阵字符串化类,它可以按照你想要的方式格式化字符串。

希望这有帮助。有问题,请问。