C#矩阵类设计(转置方法)

本文关键字:转置 方法 | 更新日期: 2023-09-27 18:26:31

我目前正在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();
        }
    }
}

你喜欢哪种方式,为什么?或者有更好的方法来实现矩阵的换位吗?

非常感谢!

Benjamin

C#矩阵类设计(转置方法)

我宁愿投票给

  public Matrix Transpose() { ... }

可能性1

是,IMHO,可疑,因为矩阵似乎是不可变的(所有其他方法都不会改变它)。此外,其他操作(如果您决定实现它们),例如算术+、-、*、/、也不会更改初始矩阵,而是返回新的矩阵。

   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

是最好的一个;我宁愿将方法从GetTranspsed()重命名为Transpse()-我们通常使用活动名称-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

I、 就个人而言,不喜欢它,因为TransposeMatrix不是在其名称的典型意义上的属性,如RowCount、ColCount、IsUnit、IsDegenrate。。。相反,TransposeMatrix看起来与函数非常相似,如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:

IMHO,听起来很自然。我的想法是:"我有一个矩阵实例a,我想从中得到一个转置矩阵,比如说B,所以我应该对a做点什么"。我将开始寻找方法:

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

静态方法很好,IMHO,用于创建。例如

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