Как я могу умножить две матрицы в C #? - PullRequest
8 голосов
/ 10 июня 2011

Как описано в заголовке, есть ли какая-то библиотека в среде 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

        }

    }

Я забыл сказать: я хочу, чтобы веб-сервис умножился на него.

Спасибо:)

Ответы [ 12 ]

10 голосов
/ 10 июня 2011

Хотя в .NET нет встроенной среды Maths для этого (можно использовать библиотеку XNA Maths), в пространстве имен System.Windows.Media есть Matrix. Структура Matrix имеет метод Multiply , который принимает другую матрицу и выводит матрицу.

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;

В основном используется для 2D-преобразования:

Представляет аффинное преобразование 3x3 матрица, используемая для преобразования в 2-D пространство.

но если это соответствует вашим потребностям, тогда не нужно никаких сторонних библиотек.

9 голосов
/ 17 февраля 2014

Логика для умножения двух матриц показана на рисунке ниже:

enter image description here

Строка первой матрицы и столбец второй матрицыпринимаются.Соответствующие термины умножаются и складываются вместе.Они хранятся в расположении (матрица C), которое определяется числом строк матрицы A и номером столбца матрицы B. Самый простой способ сделать это в вашем коде - добавить всего 3 для циклов.Первые два цикла имитируют номер строки и номер столбца.Третий цикл for складывает три умноженных пары элементов и сохраняет их результат в C-матрице.Посмотрите код ниже:

    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);
        }
    }

Источник http://www.Code -Kings.com //

8 голосов
/ 27 декабря 2013

умножить 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;
        }
    }
3 голосов
/ 05 октября 2018

Хотя вы можете умножать матрицы с помощью итеративного подхода (для циклов), выполнение вычислений с помощью линейной алгебры очистит ваш код и даст вам прирост производительности, который в несколько раз быстрее!

В 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;

Он не имеет зависимостей и может использоваться в .net core 2.0, что делает его отличным выбором для избегания методов итеративного умножения матриц и использования преимуществ линейной алгебры .

3 голосов
/ 10 июня 2011

CSML - C # Matrix Library - это компактный и легкий пакет для числовой линейной алгебры. Многие матричные операции, известные из Matlab, Scilab и Co., реализованы. Смотрите это !

3 голосов
/ 10 июня 2011

В .NET ничего не встроено. Вам придется написать умножение самостоятельно или использовать стороннюю библиотеку. Я написал в блоге об одном способе достижения этого путем сравнения двух разных реализаций: стандартного наивного алгоритма и одного с использованием небезопасного кода.

1 голос
/ 10 июня 2011

Нет таких встроенных библиотек.Если вы не используете XNA - он имеет класс Matrix, хотя он ограничен и предназначен для 3D-игр.

Есть много матрица библиотеки для .NET, хотя.

0 голосов
/ 23 сентября 2018

Вот мой код: 4 * 4 матрицы

for (int i = 0; i < 4; i++)
{        
    int column = 0;
    while (column < 4)
    {
        int count = 0;
        for (int j = 0; j < 4; j++)
        {
            matrixResult[i, column] += Convert.ToInt32(matrixR[i, j] * matrixT[count, column]);
            count = count + 1;
        }
        column = column + 1;
    }       

}

0 голосов
/ 25 марта 2018

Я написал небольшую программу для умножения двух матриц 3 x 3, как часть моей нейронной сети для моего проекта уровня A. Надеюсь, люди найдут это полезным.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _3_x_3_Matrix_multiplier
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,,] matrix = new int[3, 3, 3];
            for (int z = 0; z < 2; z++)
            {
                for (int y = 0; y < 3; y++)
                {
                    for (int x = 0; x < 3; x++)
                    {
                        Console.WriteLine("element: {0} , {1}", x, y);
                        matrix[x, y, z] = int.Parse(Console.ReadLine());
                    }
                }
            }
            for (int xm = 0; xm < 3; xm++)
            {
                for (int ym = 0; ym < 3; ym++)
                {
                    for (int zm = 0; zm < 3; zm++)
                    {
                        matrix[xm, ym, 2] += (matrix[0 + zm, ym, 0] * matrix[xm, 0 + zm, 1]);
                    }
                }
            }
            for (int i = 0; i < 3; i++)
            {
                Console.Write("\n");
                for (int j = 0; j < 3; j++)
                {
                    Console.Write(matrix[j, i, 2] + " ");
                }
            }
            Console.ReadLine();
        }
    }
}
0 голосов
/ 21 августа 2016

Ниже приведен метод умножения матрицы int [3,4] на матрицу int [4,3], она имеет временную сложность O (n куб) или кубическое время

Программа класса { static void Main (строка [] args) {

        MultiplyMatrix();
    }

    static void MultiplyMatrix()
    {
        int[,] metrix1 = new int[3,4] { { 1, 2,3,2 }, { 3, 4,5,6 }, { 5, 6,8,4 } };
        int[,] metrix2 = new int[4, 3] { { 2, 5, 3 }, { 4, 5, 1 }, { 8, 7, 9 }, { 3, 7, 2 } };
        int[,] metrixMultplied = new int[3, 3];

        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            { 
                for(int i=0;i<4;i++)
                {
                    metrixMultplied[row, col] = metrixMultplied[row, col] + metrix1[row, i] * metrix2[i, col];

                }
                Console.Write(metrixMultplied[row, col] + ", ");                   
            }
            Console.WriteLine();
        }
        Console.ReadLine();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...