如何在C#中乘以两个矩阵?

Har*_*9pl 8 c# math

就像在标题中描述的那样,Microsoft框架中是否有一些库允许将两个矩阵相乘或者我必须编写自己的方法来执行此操作?//我现在已经得到了答案

第二个问题:我使用MultiplyMatrix方法编写了这个多类,但它不能像我想的那样工作.谁能帮忙告诉我哪里弄错了?

class multi
    {
        public void MultiplyMatrix(double[,] _A, double[,] _B, int _n, int _m, int _r)
        {
            int n, m, r;
            double si;
            n = _n;
            m = _m;
            r = _r;
            double[,] A = new double[n, m];
            double[,] B = new double[m, r];
            double[,] C = new double[n, r];
            A = _A;
            B = _B;
            try
            {
                for (int i = 0; i < n; i++)
                {
                    for (int j = 0; j < r; j++)
                    {
                        si = 0;
                        for (int k = 0; k < m; k++)
                        {
                            si += A[i, m + k] + B[k, r + j];
                        }
                        C[i, r + j] = si;
                    }
                }
                for (int i = 0; i < C.Length; i++)
                {
                    for (int j = 0; j < C.Length; j++)
                    {
                        Console.Write(C[i, j]+" ");
                        if (j % 3 == 0)
                            Console.WriteLine();
                    }
                }
            }
            catch (IndexOutOfRangeException) { } // I always get this exception

        }

    }
Run Code Online (Sandbox Code Playgroud)

我忘了告诉:我想建立一个网络服务来增加它.

谢谢:)

key*_*rdP 10

虽然没有内置的数学框架,这样做的.NET(可以使用XNA的数学库),有一个MatrixSystem.Windows.Media命名空间.Matrix结构具有乘法方法,该方法接收另一个矩阵并输出矩阵.

Matrix matrix1 = new Matrix(5, 10, 15, 20, 25, 30);
Matrix matrix2 = new Matrix(2, 4, 6, 8, 10, 12);

// matrixResult is equal to (70,100,150,220,240,352) 
Matrix matrixResult = Matrix.Multiply(matrix1, matrix2);

// matrixResult2 is also
// equal to (70,100,150,220,240,352) 
Matrix matrixResult2 = matrix1 * matrix2;
Run Code Online (Sandbox Code Playgroud)

这主要用于2D转换:

表示用于2-D空间中的变换的3x3仿射变换矩阵.

但如果它符合您的需求,那么就不需要任何第三方库.


小智 9

两个矩阵相乘的逻辑如下图所示:

在此输入图像描述

将获取第二个Matrix的第一个Matrix和Column的行.相应的术语相乘并相加.它们存储在由矩阵A的行号和矩阵B的列号指定的位置(矩阵C)中.在代码中执行此操作的最简单方法是添加总共3个for循环.前两个循环模拟行号和列号.第三个for循环将三个相乘的元素组合在一起并将其结果存储在C Matrix中.观看以下代码:

    public void MultiplyMatrix()
    {
        if (a.GetLength(1) == b.GetLength(0))
        {
            c = new int[a.GetLength(0), b.GetLength(1)];
            for (int i = 0; i < c.GetLength(0); i++)
            {
                for (int j = 0; j < c.GetLength(1); j++)
                {
                    c[i, j] = 0;
                    for (int k = 0; k < a.GetLength(1); k++) // OR k<b.GetLength(0)
                        c[i, j] = c[i, j] + a[i, k] * b[k, j];
                }
            }
        }
        else
        {
            Console.WriteLine("\n Number of columns in First Matrix should be equal to Number of rows in Second Matrix.");
            Console.WriteLine("\n Please re-enter correct dimensions.");
            Environment.Exit(-1);
        }
    }
Run Code Online (Sandbox Code Playgroud)

来源http://www.Code-Kings.com//


Dwi*_*ham 8

乘以2矩阵:

public double[,] MultiplyMatrix(double[,] A, double[,] B)
    {
        int rA = A.GetLength(0);
        int cA = A.GetLength(1);
        int rB = B.GetLength(0);
        int cB = B.GetLength(1);
        double temp = 0;
        double[,] kHasil = new double[rA, cB];
        if (cA != rB)
        {
            Console.WriteLine("matrik can't be multiplied !!");
        }
        else
        {
            for (int i = 0; i < rA; i++)
            {
                for (int j = 0; j < cB; j++)
                {
                    temp = 0;
                    for (int k = 0; k < cA; k++)
                    {
                        temp += A[i, k] * B[k, j];
                    }
                    kHasil[i, j] = temp;
                }
            }
        return kHasil;
        }
    }
Run Code Online (Sandbox Code Playgroud)


小智 7

尽管您可以通过迭代方法(for 循环)来乘以矩阵,但使用线性代数执行计算将清理您的代码,并使您的性能提升数倍!

存在的NuGet一个免费图书馆- MathNet.Numerics。它使矩阵相乘变得非常容易:

Matrix<double> a = DenseMatrix.OfArray(new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } });
Matrix<double> b = DenseMatrix.OfArray(new double[,] { { 1 }, { 2 }, { 3 } });
Matrix<double> result = a * b;
Run Code Online (Sandbox Code Playgroud)

它没有依赖关系,可以在 .net core 2.0 中使用,使其成为避免迭代矩阵乘法技术和利用线性代数的绝佳选择。


Dar*_*rov 3

.NET 中没有内置任何内容。您必须自己编写乘法或使用某些第三方库。我在博客中介绍了一种实现此目的的方法,比较了两种不同的实现:一种标准的朴素算法和一种使用不安全代码的算法。