Множення матриці на вектор

Про множенні матриці на ветор можливі два варіанти:

  • множення на ветор-стовпчик;
  • множення на вектор рядок.

Щоб знайти добуток матриці та ветора, необхідно множити по правилу «рядок на стовпчик»:

  • якщо помножити матрицю на ветор-стовпчик, число стовпчиків в матриці повинно співпадати з кількістю елементів в векторі-стовпчику;
  • результатом множення ветора-стовпчика на матрицю є вектор-стовпчик:
  • якщо помножити матрицю на вектор-рядок, то матриця повинна бути вектором-стовпчиком, при чому кількість її стовпців повинна дорівнювати кількості елементів в векторі-рядку:

Реалізація алгоритму

using System;

// клас з методами розширення
static class Ext
{
    // метод розширення для отримання кількості рядків матриці
    public static int RowsCount(this double[,] matrix)
    {
        return matrix.GetUpperBound(0) + 1;
    }

    // метод розширення для отримання кількості стовпців матриці
    public static int ColumnsCount(this double[,] matrix)
    {
        return matrix.GetUpperBound(1) + 1;
    }

    // метод для виводу матриці на екран
    public static void Print(this double[,] matrix)
    {
        for (var i = 0; i < matrix.RowsCount(); i++)
        {
            for (var j = 0; j < matrix.ColumnsCount(); j++)
            {
                Console.Write(matrix[i, j].ToString().PadLeft(4));
            }

            Console.WriteLine();
        }
    }

    // метод для виводу вектора на екран
    public static void Print(this double[] vector, bool vectorIsRow)
    {
        for (var i = 0; i < vector.Length; i++)
        {
            Console.Write(vector[i].ToString().PadLeft(4) + (vectorIsRow ? string.Empty: "\r\n" ));
        }
        Console.WriteLine();
    }
}

class Program
{
    // метод для отримання ветора з консолі
    static double[] GetVectorFromConsole(string vectorName) 
    {
        Console.Write("Кількість елементів вектора {0}:", vectorName);
        var n = int.Parse(Console.ReadLine());
        var vector = new double[n];
        for(var i = 0; i < vector.Length; i++)
        {
            Console.Write("{0}[{1}] = ", vectorName, i);
            vector[i] = double.Parse(Console.ReadLine());
        }
        
        return vector;
    }

    // метод для отримання матриці з консолі
    static double[,] GetMatrixFromConsole(string name)
    {
        Console.Write("Кількість рядків матриці {0}:", name);
        var n = int.Parse(Console.ReadLine());
        Console.Write("Кількість стовпів матриці {0}: ", name);
        var m = int.Parse(Console.ReadLine());

        var matrix = new double[n, m];
        for (var i = 0; i < n; i++)
        {
            for (var j = 0; j < m; j++)
            {
                Console.Write("{0}[{1},{2}] = ", name, i, j);
                matrix[i, j] = double.Parse(Console.ReadLine());
            }
        }

        return matrix;
    }

    // метод для множення матриці на ветор
    static double[,] VectorMatrixMultiplication(double[,] inputMartix, double[] vector, bool vectorIsRow)
    {
        double[,] resultMatrix;
        if (vectorIsRow)
        {
            if (inputMartix.ColumnsCount() != 1)
            {
                throw new Exception("Помилка! Матриця повинна містити тільки один стовпчик.");
            }
            if (inputMartix.RowsCount() != vector.Length)
            {
                throw new Exception("Помилка! Кількість рядків матриці не рівне кількості елементів вектора.");
            }

            resultMatrix = new double[vector.Length, vector.Length];

            for (var i = 0; i < resultMatrix.RowsCount(); i++)
            {
                for (var j = 0; j < resultMatrix.ColumnsCount(); j++)
                {
                    resultMatrix[i, j] = inputMartix[i, 0] * vector[j];
                }
            }
        }
        else
        {
            if (inputMartix.ColumnsCount() != vector.Length)
            {
                throw new Exception("Помилка! Кількість стовпців матриці не рівне кількості елементів вектора.");
            }

            resultMatrix = new double[inputMartix.RowsCount(), 1];

            for (var i = 0; i < inputMartix.RowsCount(); i++)
            {
                resultMatrix[i, 0] = 0;

                for (var k = 0; k < inputMartix.ColumnsCount(); k++)
                {
                    resultMatrix[i, 0] += inputMartix[i, k] * vector[k];
                }
            }
        }

        return resultMatrix;
    }

    static void Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8;
        Console.WriteLine("Програма для множення матриці на ветор");

        var m = GetMatrixFromConsole("M");
        var v = GetVectorFromConsole("V");

        Console.WriteLine("Вектор с рядком(R) чи стовпцем(C):");
        bool vectorIsRow = Console.ReadLine().ToUpper() == "R";

        Console.WriteLine("Матриця M:");
        m.Print();

        Console.WriteLine("Вектор V:");
        v.Print(vectorIsRow);

        var result = VectorMatrixMultiplication(m, v, vectorIsRow);
        Console.WriteLine("Результат множення матриці M на вектор V:");
        result.Print();

        Console.ReadLine();
    }
}

Дивіться також: