【问题标题】:C# matrix-class design (transpose method)C#矩阵类设计(转置法)
【发布时间】:2013-08-06 10:16:45
【问题描述】:

我目前正在研究 C# 中的矩阵实现。这不是关于如何……的问题。应该工作或某事。相似的。它更多的是关于“设计部分”......所以,我想实现一个函数,它转置一个矩阵(http://en.wikipedia.org/wiki/Transpose)。想的很简单,但我真的很难选择,哪种实现方式最优雅。

但这里首先是矩阵类的代码:

namespace Math
{
    public class Matrix
    {
        protected double[,] matrix;

        public Matrix(byte m, byte n)[...]
        public Matrix(Matrix matrix)[...]

        public byte M { get; private set; }
        public byte N { get; private set; }

        // Possibility 1 (changes the matrix directly)
        public void Transpose()[...]

        // Possibility 2 (getter method)
        public Matrix GetTransposed()[...]

        // Possibility 3 (property)
        public Matrix TransposedMatrix
        {
            get[...]
        }

        // Possibility 4 (static method; a bit like an operator)
        public static Matrix Transpose(Matrix matrix)[...]
    }
}

在这里,您将如何使用不同的可能性:

namespace MathTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create a new matrix object...
            var mat1 = new Math.Matrix(4, 4);

            // Using possibility 2 (getter method, like "GetHashCode()" or sth. similar)
            var mat2 = mat1.GetTransposed();

            // Using possibility 3 (the transposed matrix is a property of each matrix)
            var mat3 = mat1.TransposedMatrix;

            // Using possibility 4 (definition and use is like an unary operator)
            var mat4 = Math.Matrix.Transpose(mat1);

            // Using possibility 1 (changes the matrix directly)
            mat1.Transpose();
        }
    }
}

您更喜欢哪种方式,为什么?或者有没有更好的方法来实现矩阵的转置?

非常感谢!

本杰明

【问题讨论】:

    标签: c# class matrix transpose


    【解决方案1】:

    我宁愿投票给

      public Matrix Transpose() { ... }
    

    可能性1

    恕我直言,这是可疑的,因为 Matrix 似乎是不可变的(所有其他方法都不会改变它)。此外,其他操作(如果您决定实施它们)例如算术 +, -, *, /, 不改变初始矩阵,它们返回一个矩阵。

       Matrix B = -A; // <- A doesn't changed
       Matrix D = A + B * C; // <- A, B, C don't changed
       Matrix E = F.Transpose(); // <- I hope to have F being intact as well
    

    可能性2

    是最好的;我宁愿将方法从 GetTransposed() 重命名为 Transpose() - 我们通常使用活动名称 - Perform、Send、Write 而不是 GetPerformed、GetSent 等。

      // looks better than
      // A.GetPerformed().GetValidated().GetSentTo(@"Me@MyServer.com"); 
      A.Perform().Validate().SendTo(@"Me@MyServer.com"); 
    
      // The same with transpose:
      // easier to read than
      // A.GetTransposed().GetAppied(x => x * x).GetToString();
      A.Transpose().Apply(x => x * x).ToString();
    

    可能性 3

    我个人不喜欢它,因为 TransposedMatrix 不是 其名称的典型意义 像 RowCount、ColCount、IsUnit、IsDegenrate...相反,TransposedMatrix 看起来非常类似于 函数,例如 Exp()、Sqrt()...

      A.ColCount; // <- property of the matrix
      A.IsDegenerate; // <- another property of the matrix
      A.ToString(); // <- is not a property: it's conversion (function) into string representation
      A.Sqrt(); // <- is not a property, square root is a function
      A.Transpose(); // <- is not a propery either: it's a function too
    

    可能性4:

    恕我直言,听起来不自然。我的想法是:“我有一个矩阵实例 A,我想从中得到一个转置矩阵,比如 B,所以我应该对 A 做点什么”。我会开始寻找方法:

       B = A.Transpose();
       B = A.ToTransposed();
       B = A.GetTransposed();
       B = A.Rotate(); 
       B = A.Transform(...);
       B = A.DoSomething();
    

    静态方法很好,恕我直言,创建。例如

       A = Math.Matrix.Zero(5); // <- Create 5x5 Matrix, all zeroes
       B = Math.Matrix.Unit(6); // <- 6x6 unit matrix
    

    【讨论】:

    • 谢谢 :) !是的,可能性 1 有点奇怪(与您的论证相同),但为了完整起见,我想提一下。与可能性3相同,因为我认为一个矩阵不能是另一个矩阵的属性,但是还有其他几种观点,所以我在这里也提到了。对于可能性 2:好的,但我会感觉到,矩阵会直接改变......不知道为什么,但这将是最小的问题;)......你也有一个想法,如果可能性 4可能是“替代方案”(或者我应该同时实现:两个和四个)?
    • 好吧,可能性 4,恕我直言,有点奇怪 - 在我看来,静态方法调用在这里很不自然。但是,它可以作为简单 Transpose() 方法的补充。所以可能性 2 仍然是,恕我直言,最好的一个。
    • 好吧,似乎是逻辑 ;) 。也许我也会实施 4,但我肯定会选择 2... 是的,我也认为,例如获得一个单位矩阵,不必已经有一个,所以我将此方法设为静态。可能性 4 只出现在我的脑海中,因为自定义运算符定义也被标记为静态,尽管你必须至少有一个类的对象。那么,再次非常感谢:)!
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多