49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
1

Перемножение матриц

08.12.2009, 22:57. Показов 116834. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
можете помоч с задачей: нужно написать программу, которая перемножает 2 матрицы и выводит результат. Программы должна работать так: пользователь вводит значения элементов обеих матриц и если количество столбцов первой матрицы не совпадает с количеством строк второй, то прога говорит, что перемножить нельзя , если совпадают, то перемножает)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2009, 22:57
Ответы с готовыми решениями:

Перемножение матриц
Подскажите, как перемножить две матрицы: var a = new { {5, 10, 13, -4, 10}, ...

Перемножение матриц
Есть много матриц в массивах var Matrix = new int; Как их все перемножить?

Перемножение матриц
Очень нужна ваша помощь, курсач горит а написать не получается.) задача такова, нужно сделать...

Перемножение матриц
Добрый вечер. Как запихнуть перемножение матриц в 2 for-a? Мои попытки оказались не правильными. ...

17
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
08.12.2009, 23:07 2
как перемножаются матрицы известно?
1. проверяешь или можно вообще их перемножить
2. потом строчка на столбик и столбик на строчку
3. получаешь матрицу и выводишь её пользователю

немного есть тут
0
49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
08.12.2009, 23:35  [ТС] 3
я знаю как перемножать матрицы, но не совсем понятно как это реализовать в виде кода
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
08.12.2009, 23:35 4
Лучший ответ Сообщение было отмечено как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Введите размерность первой матрицы: ");
            int[,] A = new int[Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine())];
            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    Console.Write("A[{0},{1}] = ", i, j);
                    A[i, j] = Convert.ToInt32(Console.ReadLine());
                }
            }
            Console.WriteLine("Введите размерность второй матрицы: ");
            int[,] B = new int[Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine())];
            for (int i = 0; i < B.GetLength(0); i++)
            {
                for (int j = 0; j < B.GetLength(1); j++)
                {
                    Console.Write("B[{0},{1}] = ", i, j);
                    B[i, j] = Convert.ToInt32(Console.ReadLine());
                }
            }
 
            Console.WriteLine("\nМатрица A:");
            Print(A);
            Console.WriteLine("\nМатрица B:");
            Print(B);
            Console.WriteLine("\nМатрица C = A * B:");
            int[,] C = Multiplication(A, B);
            Print(C);
 
        }
        static int[,] Multiplication(int[,] a, int[,] b)
        {
            if (a.GetLength(1) != b.GetLength(0)) throw new Exception("Матрицы нельзя перемножить");
            int[,] r = new int[a.GetLength(0), b.GetLength(1)];
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < b.GetLength(1); j++)
                {
                    for (int k = 0; k < b.GetLength(0); k++)
                    {
                        r[i,j] += a[i,k] * b[k,j];
                    }
                }
            }
            return r;
        }
        static void Print(int[,] a)
        {
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < a.GetLength(1); j++)
                {
                    Console.Write("{0} ", a[i, j]);
                }
                Console.WriteLine();
            }
        }
    }
}
9
49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
08.12.2009, 23:54  [ТС] 5
Цитата Сообщение от HIMen Посмотреть сообщение
A.GetLength(0);
можете объяснить что это значит?

Добавлено через 3 минуты
Цитата Сообщение от HIMen Посмотреть сообщение
if (a.GetLength(1) != b.GetLength(0)) throw new Exception("Матрицы нельзя перемножить");
и объясните поподробнее как это на действии реализуется
зы что значит throw new Exception ?
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
09.12.2009, 00:20 6
GetLength возвращает длину массива в одном из измерений,
throw new Exception кидает ексепшн, что матрицы нельзя перемножить
0
49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
09.12.2009, 01:00  [ТС] 7
что значит "в одном из измерений" ?
зы когда я ввожу количество строк и столбцов, например 3 ,2 и 3, 2 (то есть неправильно) программы не говорит, что перемножить нельзя перемножить в исходнике , а надо , чтобы когда ввели неправильное количество столбцов второй матрицы прога писала , что перемножить нельзя и прерывала цикл
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
09.12.2009, 01:09 8
Цитата Сообщение от Helios1.618 Посмотреть сообщение
что значит "в одном из измерений" ?
[1 1 1]
[1 1 1]
в одном измерении длина 3, в другом 2
Цитата Сообщение от Helios1.618 Посмотреть сообщение
зы когда я ввожу количество строк и столбцов, например 3 ,2 и 3, 2 (то есть неправильно) программы не говорит, что перемножить нельзя
у меня говорит
Миниатюры
Перемножение матриц  
0
49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
09.12.2009, 01:32  [ТС] 9
у меня после вывода строки "Матрица C = A * B:" я вылетаю из программы и в коде жёлтым цветом выделяется строка "throw new Exception("Матрицы нельзя перемножить");" и над ней появляется ссылка : Exeption не обработано , матрицы нельзя перемножить

Добавлено через 3 минуты
можно тогда вместо этого сделать так : чтобы при несоответствии столбцов и строк, прога писала , что нельзя перемножить, и затем нажимаешь любую клавишу и прога запускается сначала ?

Добавлено через 9 минут
Цитата Сообщение от HIMen Посмотреть сообщение
Цитата:
Сообщение от Helios1.618
что значит "в одном из измерений" ?
[1 1 1]
[1 1 1]
в одном измерении длина 3, в другом 2
Цитата Сообщение от Helios1.618 Посмотреть сообщение
if (a.GetLength(1) != b.GetLength(0)) throw new Exception("Матрицы нельзя перемножить");
а в скобках тогда что стоит ?
0
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
09.12.2009, 02:08 10
текст с вызовом функции заключите в try/catch:

C#
1
2
3
4
5
6
7
8
9
try
{
 Multiplication (A,B);
....
}
catch
{
// делаем то что нужно - выходим
}
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
09.12.2009, 13:06 11
господа, на сколько мне известно множить можно только матрицы размерностями [a,b] на [b,a]
0
49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
09.12.2009, 19:48  [ТС] 12
Цитата Сообщение от Helios1.618 Посмотреть сообщение
Сообщение от Helios1.618
if (a.GetLength(1) != b.GetLength(0)) throw new Exception("Матрицы нельзя перемножить");
а в скобках тогда что стоит ?
что значит (1) или (0) ?

Добавлено через 24 минуты
Alligieri,
что-то я не могу понять как использовать try catch , напишите пожалуйста эту часть программы целеком
0
2096 / 1261 / 171
Регистрация: 01.02.2009
Сообщений: 2,842
09.12.2009, 20:33 13
Цитата Сообщение от Helios1.618 Посмотреть сообщение
что значит (1) или (0) ?
Цифры необходимы для того, чтобы указать на получение длины столбца(1) и строки(0) соответственно.

Добавлено через 22 минуты
Цитата Сообщение от Helios1.618 Посмотреть сообщение
что-то я не могу понять как использовать try catch , напишите пожалуйста эту часть программы целиком
Запиши так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Console.WriteLine("\nМатрица A:");
            Print(A);
            Console.WriteLine("\nМатрица B:");
            Print(B);
            Console.WriteLine("\nМатрица C = A * B:");
            if (A.GetLength(1) == B.GetLength(0))
            {
                int[,] C = Multiplication(A, B);
                Print(C);
            }
            else
            {
                Console.WriteLine("Матрицы нельзя перемножить");
            }
            Console.ReadKey();
1
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 30
16.05.2010, 05:49 14
Скажите, а как написать программу, если матрицы даны в отдельном текстовом файле и программа должна их считать с него, перемножить, а результат записать в отдельный текстовый файл?
0
2096 / 1261 / 171
Регистрация: 01.02.2009
Сообщений: 2,842
18.05.2010, 00:36 15
Mrakobes, для считывания и записи используем пространство имен System.IO;
0
1 / 1 / 0
Регистрация: 05.03.2011
Сообщений: 80
10.04.2011, 18:32 16
Написала вот такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
for (int ii = 0; ii < 3; ++ii)
                         {
                             for (int j = 0; j < 3; j++)
                             {
                                 det = P[ii, j];
                                 for (int  kk = 0; kk < 3; kk++)
                                 {
                                     P[ii, j] += P1[ii, kk] * P2[kk, j];
                                 }
                                 P[ii, j] = det;
                             }
                         }
В результате перемножения получаестя матрица, но она не совпадает с матрицей, что я просчитала вручную.... может я где-то ошиблать?
0
4 / 4 / 5
Регистрация: 12.08.2010
Сообщений: 279
25.02.2013, 13:14 17
HIMen, можешь показать как изменить твой код, чтоб матрица считалась многопоточно? например один поток на одну ячейку или строку
0
3 / 3 / 0
Регистрация: 12.09.2013
Сообщений: 21
13.02.2014, 03:20 18
Подскажите пожалуйста как эту програму сделать многопоточной? Один поток на одну строку...

Добавлено через 1 час 47 минут
Уже разобрался, если кому то понадобится, то должно быть так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static int[,] Multiplication(int[,] a, int[,] b)
        {
            if (a.GetLength(1) != b.GetLength(0)) throw new Exception("Матрицы нельзя перемножить");
            int[,] r = new int[a.GetLength(0), b.GetLength(1)];
            Parallel.For(0, a.GetLength(0), (i) =>
            {
                for (int j = 0; j < b.GetLength(1); j++)
                {
                    for (int k = 0; k < b.GetLength(0); k++)
                    {
                        r[i,j] += a[i,k] * b[k,j];
                    }
                }
            });
            return r;
        }
3
13.02.2014, 03:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2014, 03:20
Помогаю со студенческими работами здесь

Перемножение 2-х матриц
Добрый день, есть два двух мерных массива. Нужно их перемножить и вывести значения на консоль, так...

Перемножение матриц 4х4
подскажите пожалуйста, как перемножить матрицы 4х4 в С#? заранее спасибо!

Перемножение матриц блоками
Здравствуйте,столкнулся с проблемой Не могу написать перемножение двух матриц блоками. Обычное...

Перемножение двух матриц
public static int MultiplyMatrixs(int arrayA, int arrayB) { int array = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru