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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2012, 23:17   #1
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
Вопрос Умножение матриц между собой так и на число.

Добрый день Уважаемые программисты, помогите пожалуйста разобраться. С# плохо знаю, но надо срочно сделать данное задание.
Задание: Описать класс, реализующий тип данных "вещественная матрица" и работу с ними. Класс должен реализовывать следующие операции над матрицами:

1. Умножение матриц между собой так и на число
2. Возведение в степень.
3.методы вычисления детерминанта и нормы;
4.доступ к элементу по индексам
5.комбинированные операции присваивания(*=)
Написать программу, демонстрирующую все разработанные элементы класса.
Удалось сделать только 1 и 2 задание. Помогите пожалуйста с остальными, очень надо. Заранее спасибо всем.
вот все на что хватило моих знаний:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
// Все коментировал
class Program
{
    public class Matrix
    {
        double[,] matrix;
        int Row = 0, Col = 0;
 
        //матрица N x M
        public Matrix(int row, int col)
        {
            matrix = new double[row, col];
            Row = row; Col = col;
        }
 
        //квадратная матрица
        public Matrix(int N)
        {
            matrix = new double[N, N];
            Row = Col = N;
        }
 
        //перегрузка индексатора, чтобы обратится к 
        //элементу матрицы как к элементу двумерного массива
        public double this[int i, int j]
        {
            get { return matrix[i, j]; }
            set { matrix[i, j] = value; }
        }
        
        //умножение на число
        public static Matrix operator *(Matrix m, int t)
        {
            Matrix mat = new Matrix(m.Row, m.Col);
            for (int i = 0; i < m.Row; i++)
                for (int j = 0; j < m.Col; j++)
                    mat[i, j] = m[i, j] * t;
            return mat;
        }
 
        //распечатать матрицу
        public void PrintMatrix()
        {
            for (int i = 0; i < this.Row; i++)
            {
                for (int j = 0; j < this.Col; j++)
                    Console.Write("{0}  ", this[i, j]);
                Console.Write("\n");
            }
 
        }
 
        //произведение матриц
        public static Matrix operator *(Matrix first, Matrix second)
        {
            Matrix matr = new Matrix(first.Row, first.Col);
            for (int i = 0; i < first.Row; i++)
            {
                for (int j = 0; j < second.Col; j++)
                {
                    double sum = 0;
                    for (int r = 0; r < first.Col; r++)
                        sum += first[i, r] * second[r, j];
                    matr[i, j] = sum;
                }
            }
            return matr;
        }
 
        //Возв в степень
        public static Matrix operator ^(Matrix first, int pow)
        {
            Matrix matr = new Matrix(first.Row, first.Col);
            matr = first;
            for (int z = 1; z < pow; z++)
            {
                Matrix bufer = new Matrix(first.Row, first.Col);
                for (int i = 0; i < first.Row; i++)
                {
                    for (int j = 0; j < first.Row; j++)
                    {
                        double sum = 0;
                        for (int r = 0; r < first.Row; r++)
                            sum += matr[i, r] * first[r, j];
                        bufer[i, j] = sum;
                    }
                }
                matr = bufer;
            }
            return matr;
        }
    }
 
    static void Main(string[] args)
    {
        //размерность
        int N = 3;
        //степень
        int pow = 3;
 
        Random rand = new Random();
        Matrix first = new Matrix(N);
        Matrix second = new Matrix(N);
 
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
            {
                first[i, j] = rand.Next(1, 4);
                second[i, j] = rand.Next(1, 4);
            }
 
        Console.WriteLine("Первая матрица:\n\n");
        first.PrintMatrix();
        Console.WriteLine("\n\nВторая матрица:\n\n");
        second.PrintMatrix();
        Console.WriteLine("\n\nУмножение на число:\n\n");
        (first * 3).PrintMatrix();
        Console.WriteLine("\n\nПроизведение матриц:\n\n");
        (first * second).PrintMatrix();
        Console.WriteLine("\n\n{0} Степень матрицы:\n\n", pow);
        (first ^ pow).PrintMatrix();
        Console.ReadKey();
    }
}

Последний раз редактировалось PROkaZZZniK; 13.05.2012 в 22:24.
PROkaZZZniK вне форума Ответить с цитированием
Старый 13.05.2012, 15:29   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Эмм... а не хватило знаний именно С# или матриц?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 13.05.2012, 16:49   #3
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Эмм... а не хватило знаний именно С# или матриц?
С матрицами, c# тоже начал изучать недавно пару месяцев назад. Вот попалось такое задание. НЕ понимаю как решить. Почитал Вики про детерминант (умножение матриц по диагоналям как я понял) и нормы(даже не понял что это). Построил примерно алгоритм решения(Перебрать матрицу, выбрать нужные элементы, умножить): 1.Детерминант-умножение матрицы по диагоналям. 2.определить элементы на диагонали. 3. перебрать двумерный массив и найти диагональные элементы. 4.Двумерный массив перебирается двумя циклами - один в другом. 5.Диагональные элементы имеют определенные индексы в массиве -1 строчка 1 стобец; 2строчка 2столбец; 3 строчка 3 столбец. Вот только не получается это реализовать в виде кода. С нормами вообще беда... В общем прошу помощи!
Выручите пожалуйста!!!

Последний раз редактировалось PROkaZZZniK; 13.05.2012 в 18:27.
PROkaZZZniK вне форума Ответить с цитированием
Старый 13.05.2012, 20:52   #4
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
По умолчанию

Причитал 2 раза тему " Работа с матрицами и списками. Типичные задачи. Теория." не нашел того что мне надо.
PROkaZZZniK вне форума Ответить с цитированием
Старый 13.05.2012, 21:48   #5
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Про норму почитайте тут. Мне кажется, тут более адекватно написано.

Детерминант - это не совсем умножение матриц по диагоналям. Так как у вас матрица любой размерности, то тут будет применена формула

Почитайте про дополнительный минор (это матрица, образующаяся из вашей в результате "обрезания" из нее столбца и строки, в которой у вас стоит A1j). Делать это надо рекурсией до тех пор, пока у вас не получится в миноре матрица первого порядка, определителем которой является, собственно, сам элемент этой матрицы.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 13.05.2012, 22:17   #6
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Про норму почитайте тут. Мне кажется, тут более адекватно написано....
Прочитал. Спасибо хоть за какое то содействие. Все равно сам не напишу это задание((((
Еще вопрос представленный мной ~ алгоритм решения детерминанта верный?

Цитата:
Сообщение от ACE Valery Посмотреть сообщение

Детерминант - это не совсем умножение матриц по диагоналям. Так как у вас матрица любой размерности.
У меня вроди бы матрица квадратная и фиксированная (3х3)

Тема актуальна! Может кто нибудь поможет доделать задание.

Последний раз редактировалось Stilet; 14.05.2012 в 12:05.
PROkaZZZniK вне форума Ответить с цитированием
Старый 14.05.2012, 13:01   #7
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Цитата:
У меня вроди бы матрица квадратная и фиксированная (3х3)
Эм... простите, а код ВЫ писали? А то начинаю сомневаться... Тут конструктор как для квадратной, так и для прямоугольной матрицы. Причем квадратная может быть любой размерности.
Код:
//матрица N x M
        public Matrix(int row, int col)
        {
            matrix = new double[row, col];
            Row = row; Col = col;
        }
 
        //квадратная матрица
        public Matrix(int N)
        {
            matrix = new double[N, N];
            Row = Col = N;
        }
Для 3х3 в статье Википедии есть отличная формула


Тут даже думать не надо, просто подставить ее в код.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 14.05.2012, 15:33   #8
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Эм... простите, а код ВЫ писали?
Да я писал. не но если поменять
Код:
//размерность
        int N = 3;
то да матрица будет другой.
PROkaZZZniK вне форума Ответить с цитированием
Старый 14.05.2012, 19:14   #9
PROkaZZZniK
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 121
По умолчанию

ACE Valery, вопрос вот в чем. Разве исходя из этого нельзя описать алгоритм для любой матрицы?

Вот есть матрица:
1 2
3 4

Как посчитать? (1*4)-(3*2)

2.
1 2 3
4 5 6
7 8 9
(1*5*9) + (2*6*7) + (3*4*8) - (3*5*7) - (2*4*9) - (1*6*8)

P.S я вижу закономерность но не знаю как ее описать.
PROkaZZZniK вне форума Ответить с цитированием
Старый 14.05.2012, 19:36   #10
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
Разве исходя из этого нельзя описать алгоритм для любой матрицы?
Алгоритм чего? нахождения детерминанта?
так есть же
http://ru.wikipedia.org/wiki/%D0%9E%...B5%D0%BB%D1%8C
выбирайте любой метод!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти матрицу, представляющую собой сумму двух данных матриц lokomotiv C# (си шарп) 0 17.12.2011 14:34
Подключение двух коммутаторов между собой?? Makaveli1986 Помощь студентам 2 21.11.2011 09:45
связь пользователей между собой на сайте строгийЁЖ PHP 5 05.08.2011 11:22
Как сравнить элементы 2 массивов между собой? DragonionS Общие вопросы Delphi 1 01.07.2007 21:49