Про множенні матриці на ветор можливі два варіанти:
- множення на ветор-стовпчик;
- множення на вектор рядок.
Щоб знайти добуток матриці та ветора, необхідно множити по правилу «рядок на стовпчик»:
- якщо помножити матрицю на ветор-стовпчик, число стовпчиків в матриці повинно співпадати з кількістю елементів в векторі-стовпчику;
- результатом множення ветора-стовпчика на матрицю є вектор-стовпчик:
- якщо помножити матрицю на вектор-рядок, то матриця повинна бути вектором-стовпчиком, при чому кількість її стовпців повинна дорівнювати кількості елементів в векторі-рядку:
Реалізація алгоритму
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();
}
}