Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2013, 09:17   #1
MJBuster
 
Регистрация: 11.01.2012
Сообщений: 6
По умолчанию Умножение матриц

Пробовал сделать умножение матриц, но не выходит. Подскажите, что нужно изменить, чтобы получилось.
Program.cs
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class FunctionsForMatrix
    {
        static public void Filling(Matrix A)
        {
            for (int i = 0; i < A.N; ++i)
            {
                for (int j = 0; j < A.M; ++j)
                {
                    bool flag = true;
                    while (flag)
                    {
                        try
                        {
                            Console.Write("A[" + (i + 1) + "," + (j + 1) + "] = ");
                            A[i, j] = Convert.ToDouble(Console.ReadLine());
                            flag = false;
                        }
                        catch (FormatException)
                        {
                            Console.WriteLine("Неверное значение. Попробуйте снова");
                        }
                    }
                }
            }
        }
        static public Matrix NewMatrix()
        {
            Matrix A;
            int n, m;
            Console.Write("Введите количество строк матрицы:\t");
            n = Convert.ToInt32(Console.ReadLine());
            Console.Write("Введите количество столбцов матрицы:\t");
            m = Convert.ToInt32(Console.ReadLine());
            A = new Matrix(m, n);
            Console.WriteLine("Задайте элементы матрицы");
            Filling(A);
            return A;
        }
        static public void WriteMatrix(Matrix A)
        {
            for (int i = 0; i < A.M; ++i)
            {
                for (int j = 0; j < A.N; ++j)
                {
                    Console.Write(A[j, i]);
                    Console.Write('\t');
                }
                Console.WriteLine();
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Matrix A, B, C;
            A = FunctionsForMatrix.NewMatrix();
            B = FunctionsForMatrix.NewMatrix();
            try
            {
                C = A * B;
                FunctionsForMatrix.WriteMatrix(C);
            }
            catch (ArgumentException)
            {
                Console.Clear();
                Console.WriteLine("Матрицы несовместимы");
            }
            Console.ReadKey();
        }
    }
}
Matrix.cs
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Matrix
    {
                public Matrix(int N, int M)
        {
            m = M;
            n = N;
            mass = new double[N, M];
        }
        public Matrix(Matrix source)
        {
            this.m = source.M;
            this.n = source.N;
            this.mass = new double[source.N, source.M];
            this.mass = (double[,])source.mass.Clone();
        }
        ~Matrix()
        {
            m = 0;
            n = 0;
            mass = null;
        }
        private double[,] mass;
        private int m, n;
        public int N
        {
            get
            {
                if (n > 0)
                    return n;
                else
                    return -1;
            }
        }
        public int M
        {
            get
            {
                if (m > 0)
                    return m;
                else
                    return -1;
            }
        }
        public double this[int i, int j]
        {
            get
            {
                if (n > 0 && m > 0)
                    if (i > -1 && j > -1)
                        return mass[i, j];
                    else
                        Console.WriteLine("Неверный индексы");
                else
                    Console.WriteLine("Не задана матрица");
                return -1;
            }
            set
            {
                if (n > 0 && m > 0)
                    if (i > -1 && j > -1)
                        mass[i, j] = value;
                    else
                        Console.WriteLine("Неверный индексы");
                else
                    Console.WriteLine("Не задана матрица");
            }
        }
        public static Matrix operator *(Matrix A, Matrix B)
        {
            if (A.n != B.m || A.m != B.n)
                throw new System.ArgumentException("Не совпадают размерности матриц"); ;
            Matrix C = new Matrix(B.M, A.N);
            for (int i = 0; i < B.M; ++i)
                for (int j = 0; j < B.N; ++j)
                    C[i, j] = A[i, j] * B[j, i];
            return C;
        }
        public Matrix Copy()
        {
            return new Matrix(this);
        }
    }
}
MJBuster вне форума Ответить с цитированием
Старый 01.04.2013, 12:31   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Произведение матриц - матрица, каждый элемент которой есть сумма попарных произведений элементов строки первого множителя на элементы столбца второго:
Код:
public static Matrix operator *(Matrix A, Matrix B)
        {
            if (A.m != B.n) //Нужно только одно соответствие
                throw new System.ArgumentException("Не совпадают размерности матриц");
            Matrix C = new Matrix(A.n, B.m); //Столько же строк, сколько в А; столько столбцов, сколько в B 
            for (int i = 0; i < A.n; ++i){
                for (int j = 0; j < B.m; ++j){
                    C[i, j] = 0;
                    for(int k = 0; k < A.m; ++k){ //ТРЕТИЙ цикл, до A.m=B.n
                      C[i, j] += A[i, k] * B[k, j]; //Собираем сумму произведений
                    }
                }
            }
            return C;
        }
Abstraction вне форума Ответить с цитированием
Старый 01.04.2013, 13:29   #3
MJBuster
 
Регистрация: 11.01.2012
Сообщений: 6
По умолчанию

о, спасибо)
MJBuster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение матриц Macmeprag Помощь студентам 3 08.10.2011 15:58
умножение матриц затерявшисьвдебрях Помощь студентам 0 25.01.2011 22:13
умножение матриц Rusya_00 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 06.01.2011 23:51
умножение матриц Mila Volkova Помощь студентам 3 25.12.2010 14:17
Умножение матриц) Guzal Общие вопросы C/C++ 1 26.10.2010 21:56