Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
 Аватар для Slavkan
12 / 12 / 0
Регистрация: 05.07.2013
Сообщений: 82

Перемножение 2-х матриц

08.07.2013, 19:10. Показов 3956. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, есть два двух мерных массива. Нужно их перемножить и вывести значения на консоль, так как выдает ошибку на 127 строке:"Object reference not set to an instance of an object." . Сделал все. Но вот с перемножением матриц проблемы. Вот код который навоял:

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Task9
{
    class Program
    {
        static void Main(string[] args)
        {
            #region
            Console.WriteLine("Введите размер массива матриц");
            int valueArray = Convert.ToInt32(Console.ReadLine());
            #endregion
 
            #region
            Console.WriteLine("Заполните первую матрицу значениями");
            string strFirstMatrix = Console.ReadLine();
            #endregion
 
            #region
            Console.WriteLine("Заполните вторую матрицу значениями");
            string strSecondMatrix = Console.ReadLine();
            #endregion
 
            Range instRAnge = new Range();
            int[] notRangeFirstArray = instRAnge.methodConvert(strFirstMatrix);
            int[] notRangeSecondArray = instRAnge.methodConvert(strSecondMatrix);
 
            int[,] toFirstArrayValue = instRAnge.MethodFillingAnArray(notRangeFirstArray, valueArray);
            int[,] toSecondArrayValue = instRAnge.MethodFillingAnArray(notRangeSecondArray, valueArray);
 
            instRAnge.MethodToPrint(toFirstArrayValue);
            instRAnge.MethodToPrint(toSecondArrayValue);
            int[,] MultipnArrays = instRAnge.MultiplicationArrays(toFirstArrayValue, toSecondArrayValue, valueArray); //перемножение матриц
            instRAnge.printMultipnArrays(MultipnArrays, valueArray);
            Console.ReadLine();
        }
    }
 
class Range
    {
        private int[] IntValueArray;
        private int[,] MultipnArrays;
        private int MatrixArraySize;
 
        public int[] methodConvert(string value)
        {
            string[] strNorangeStrArray = value.Split(',');
            IntValueArray = new int[strNorangeStrArray.Length];
            for (int i = 0; i < strNorangeStrArray.Length; i++)
            {
                IntValueArray[i] = Convert.ToInt32(strNorangeStrArray[i]);
            }
            return IntValueArray;
        }
 
        public int[,] MethodFillingAnArray(int[] rangeArray, int intValue)
        {
            double MatrixArrayLenght = Math.Sqrt(rangeArray.Length);
            MatrixArraySize = MatrixArrayLenght % 0 > 1 ? (int)MatrixArrayLenght + 1 : (int)MatrixArrayLenght;
 
            int[,] ToArrayMatrix = new int[MatrixArraySize, MatrixArraySize];
            int indexArray = 0;
            if (rangeArray.Length <= intValue)
            {
                for (int i = 0; i < MatrixArraySize; i++)
                {
                    if (indexArray < rangeArray.Length)
                    {
                        for (int j = 0; j < MatrixArraySize; j++)
                        {
                            if (indexArray < rangeArray.Length)
                            {
                                ToArrayMatrix[i, j] = rangeArray[indexArray];
                                indexArray++;
                            }
                            else
                                break;
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("Вы ввели массив больше чем вы указали число, повторите попытку");
            }
            return ToArrayMatrix;
        }
 
        public void MethodToPrint(int[,] toArrayValue)
        {
            Console.WriteLine("Первая матрица");
            for (int i = 0; i < MatrixArraySize; i++)
            {
                for (int j = 0; j < MatrixArraySize; j++)
                {
                    Console.Write("{0}", toArrayValue[i, j]);
                }
                Console.WriteLine("");
            }
 
            Console.WriteLine("Вторая матрица");
            for (int i = 0; i < MatrixArraySize; i++)
            {
                for (int j = 0; j < MatrixArraySize; j++)
                {
                    Console.Write("{0}", toArrayValue[i, j]);
                }
                Console.WriteLine("");
            }
        }
 
        public int[,] MultiplicationArrays(int[,] firstArray, int[,] secondArray, int valueArray)
        {
 
 
            for (int i = 0; i < valueArray; i++)
            {
                for (int j = 0; j < valueArray; j++)
                {
                    for (int k = 0; k < valueArray; k++)
                    {
                        MultipnArrays[i, j] = firstArray[i, k] * secondArray[k, j];
                    }
                }
            }
            return MultipnArrays;
        }
 
        public void printMultipnArrays(int[,] MultipnArrays, int valueArray)
        {
            for (int i = 0; i < valueArray; i++)
            {
                for (int j = 0; j < valueArray; j++)
                {
                    Console.Write("{0}", MultipnArrays[i, j]);
                }
                Console.WriteLine("");
 
            }
 
        }
 
 
    }
 
 
 
 
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.07.2013, 19:10
Ответы с готовыми решениями:

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

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

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

4
4 / 4 / 1
Регистрация: 29.06.2011
Сообщений: 23
08.07.2013, 20:11
Цитата Сообщение от Slavkan Посмотреть сообщение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public int[,] MultiplicationArrays(int[,] firstArray, int[,] secondArray, int valueArray)
        {
            for (int i = 0; i < valueArray; i++)
            {
                for (int j = 0; j < valueArray; j++)
                {
                    for (int k = 0; k < valueArray; k++)
                    {
                        MultipnArrays[i, j] = firstArray[i, k] * secondArray[k, j];
                    }
                }
            }
            return MultipnArrays;
        }
Тут само перемножение матриц неверно. Читайте теорию.

П.С:
C#
1
2
3
4
                    for (int k = 0; k < valueArray; k++)
                    {
                        MultipnArrays[i, j] = firstArray[i, k] * secondArray[k, j];
                    }
Вот тут вот переменной MultipnArrays[i, j] будет valueArray раз присвоено новое значение.
1
25 / 25 / 4
Регистрация: 01.07.2013
Сообщений: 53
08.07.2013, 21:48
немного сыровато, но я мультипликатор написал так (есть ещё кое какие вопросы которые необходимо решить)
Кликните здесь для просмотра всего текста
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
68
69
70
71
72
73
class Program
    {
        static void Main(string[] args)
        {
            int[,] a = new int [2,2];
            for (int i = 0; i<2;i++)
            {
               for (int j = 0; j<2;j++)
               {
                   a[i,j]=1;
               }  
            }
 
            var A = new Matrix(a);
            var B = new Matrix(a);
            Matrix C = new Matrix();
 
            C = A * B;
 
            Console.WriteLine(C.matrixColums);
            Console.WriteLine(C.values[1, 0]);
 
            Console.ReadLine();
 
        }    
    }
 
    class Matrix
    {
        public Matrix(int[,] matrixData)
        {
            values = matrixData;
            matrixColums = matrixData.GetLength(0);
            matrixRows = matrixData.GetLength(1);
        }
 
        public Matrix() { }
 
        public int matrixColums; 
        public int matrixRows;
        public int[,] values;        
 
        public static Matrix operator *(Matrix A, Matrix B)
        {
            int[,] a = new int[A.matrixRows,B.matrixColums];
            for (int i = 0; i < A.matrixRows; i++)
            {
                for (int j = 0; j < B.matrixColums; j++)
                {
                    a[i, j] = 0;
                }
            }
            Matrix C = new Matrix(a);
          
            if (A.matrixColums == B.matrixRows)
            {
                for (int i = 0; i < A.matrixColums; i++)
                {
                    for (int j = 0; j < A.matrixColums; j++)
                    {
                        for (int k = 0; k < A.matrixColums; k++)
                        {
                            C.values[i, j] += (A.values[i, k] * B.values[k, j]);
                        }
                    }
                }
                return C;
            }
            return A;
            
        }    
 
    }
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.07.2013, 22:01
Старый код, мб пригодится:
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
using System;
using System.Threading.Tasks;
 
namespace ConsoleApplication8
{
    class Matrix
    {
        public static int[,] Multiply(int[,] a, int[,] b)
        {
            if (a.GetLength(1) != b.GetLength(0))
                throw new ArgumentException();
            var result = new int[a.GetLength(0), b.GetLength(1)];
            Parallel.For(0, a.GetLength(0), i =>
                Parallel.For(0, b.GetLength(1), j => 
                    result[i, j] = MultiplyR(a, b, i, j)));
            return result;
        }
 
        private static int MultiplyR(int[,] a, int[,] b, int i, int j)
        {
            int result = 0;
            for (int k = 0; k < a.GetLength(1); k++)
                result += a[i, k]*b[k, j];
            return result;
        }
    }
 
 
    class Program
    {
        private static int[,] a = {{2, 1}, {2, 1}};
        private static int[,] b = {{2, 1, 3}, {2, 1, 3}};
        static void Main()
        {
            var res = Matrix.Multiply(a, b);
            for (int i = 0; i < res.GetLength(0); i++)
            {
                for (int j = 0; j < res.GetLength(1); j++)
                    Console.Write(res[i, j] + " ");
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }
}
Добавлено через 6 минут
более полный вариант:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Text;
using System.Threading.Tasks;
 
 
namespace MatrixLib
{
    public class Matrix
    {
        private readonly double[,] _a;
        public int Length { get; private set; }
 
        public Matrix(double[,] a)
        {
            _a = a;
            Length = a.GetLength(0);
        }
 
        public Matrix(int n)
            : this(new double[n, n])
        {
        }
 
        public void Generate()
        {
            var r = new Random();
            for (int i = 0; i < Length; i++)
                for (int j = 0; j < Length; j++)
                    _a[i, j] = (r.Next() % 1000) / 100.0;
        }
 
        public string PrintMatrix()
        {
            var result = new StringBuilder(Length * 7);
            for (int i = 0; i < Length; i++)
            {
                for (int j = 0; j < Length; j++)
                    result.AppendFormat("{0,-7}", _a[i, j]);
                result.AppendLine();
            }
            return result.ToString();
        }
 
        public unsafe double Determinant
        {
            get
            {
                var temp = new double[_a.Length];
                Buffer.BlockCopy(_a, 0, temp, 0, temp.Length * sizeof(double));
                fixed (double* pm = &temp[0]) return _Det(pm, Length); ;
            }
        }
 
 
        unsafe double _Det(double* rmX, int n)
        {
            double* mtx_u_ii, mtx_ii_j;
            double* mtx_end = rmX + n * (n - 1), mtx_u_ii_j = null;
            double val, det = 1;
            int d = 0;
            // rmX указывает на (i,i) элемент на каждом шаге и называется ведущим
            for (double* mtx_ii_end = rmX + n; rmX < mtx_end; rmX += n + 1, mtx_ii_end += n, d++)
            {
                // Ищем максимальный элемент в столбце(под ведущим) 
                {
                    //Ищем максимальный элемент и его позицию
                    val = Math.Abs(*(mtx_ii_j = rmX));
                    for (mtx_u_ii = rmX + n; mtx_u_ii < mtx_end; mtx_u_ii += n)
                    {
                        if (val < Math.Abs(*mtx_u_ii))
                            val = Math.Abs(*(mtx_ii_j = mtx_u_ii));
                    }
                    //Если максимальный эдемент = 0 -> матрица вырожденная
                    if (Math.Abs(val - 0) < double.Epsilon) return double.NaN;
                    //Если ведущий элемент не является максимальным - делаем перестановку строк и меняем знак определителя
                    if (mtx_ii_j != rmX)
                    {
                        det = -det;
                        for (mtx_u_ii = rmX; mtx_u_ii < mtx_ii_end; mtx_ii_j++, mtx_u_ii++)
                        {
                            val = *mtx_u_ii;
                            *mtx_u_ii = *mtx_ii_j;
                            *mtx_ii_j = val;
                        }
                    }
                }
                //Обнуляем элементы под ведущим
                for (mtx_u_ii = rmX + n, mtx_u_ii_j = mtx_end + n; mtx_u_ii < mtx_u_ii_j; mtx_u_ii += d)
                {
                    val = *(mtx_u_ii++) / *rmX;
                    for (mtx_ii_j = rmX + 1; mtx_ii_j < mtx_ii_end; mtx_u_ii++, mtx_ii_j++)
                        *mtx_u_ii -= *mtx_ii_j * val;
                }
                det *= *rmX;
            }
            return *rmX * det;
        }
 
        public double this[int i, int j]
        {
            get { return _a[i, j]; }
            set { _a[i, j] = value; }
        }
 
        public static Matrix operator *(Matrix a, Matrix b)
        {
            if (a.GetLength(1) != b.GetLength(0))
                throw new ArgumentException();
            var result = new Matrix(new double[a.GetLength(0), b.GetLength(1)]);
            Parallel.For(0, a.GetLength(0), i =>
                Parallel.For(0, b.GetLength(1), j => 
                    result[i, j] = MultiplyR(a, b, i, j)));
            return result;
        }
 
        private static double MultiplyR(Matrix a, Matrix b, int i, int j)
        {
            double result = 0;
            for (int k = 0; k < a.GetLength(1); k++)
                result += a[i, k]*b[k, j];
            return result;
        }
    }
}
2
 Аватар для Slavkan
12 / 12 / 0
Регистрация: 05.07.2013
Сообщений: 82
08.07.2013, 22:17  [ТС]
Цитата Сообщение от ortex Посмотреть сообщение
Тут само перемножение матриц неверно. Читайте теорию.

П.С:
C#
1
2
3
4
                    for (int k = 0; k < valueArray; k++)
                    {
                        MultipnArrays[i, j] = firstArray[i, k] * secondArray[k, j];
                    }
Вот тут вот переменной MultipnArrays[i, j] будет valueArray раз присвоено новое значение.
Спасибо, я понял, буду разбираться.

Добавлено через 36 секунд
Цитата Сообщение от Vtiratelj Посмотреть сообщение
немного сыровато, но я мультипликатор написал так (есть ещё кое какие вопросы которые необходимо решить)
Кликните здесь для просмотра всего текста
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
68
69
70
71
72
73
class Program
    {
        static void Main(string[] args)
        {
            int[,] a = new int [2,2];
            for (int i = 0; i<2;i++)
            {
               for (int j = 0; j<2;j++)
               {
                   a[i,j]=1;
               }  
            }
 
            var A = new Matrix(a);
            var B = new Matrix(a);
            Matrix C = new Matrix();
 
            C = A * B;
 
            Console.WriteLine(C.matrixColums);
            Console.WriteLine(C.values[1, 0]);
 
            Console.ReadLine();
 
        }    
    }
 
    class Matrix
    {
        public Matrix(int[,] matrixData)
        {
            values = matrixData;
            matrixColums = matrixData.GetLength(0);
            matrixRows = matrixData.GetLength(1);
        }
 
        public Matrix() { }
 
        public int matrixColums; 
        public int matrixRows;
        public int[,] values;        
 
        public static Matrix operator *(Matrix A, Matrix B)
        {
            int[,] a = new int[A.matrixRows,B.matrixColums];
            for (int i = 0; i < A.matrixRows; i++)
            {
                for (int j = 0; j < B.matrixColums; j++)
                {
                    a[i, j] = 0;
                }
            }
            Matrix C = new Matrix(a);
          
            if (A.matrixColums == B.matrixRows)
            {
                for (int i = 0; i < A.matrixColums; i++)
                {
                    for (int j = 0; j < A.matrixColums; j++)
                    {
                        for (int k = 0; k < A.matrixColums; k++)
                        {
                            C.values[i, j] += (A.values[i, k] * B.values[k, j]);
                        }
                    }
                }
                return C;
            }
            return A;
            
        }    
 
    }
Я понял, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.07.2013, 22:17
Помогаю со студенческими работами здесь

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

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

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

Перемножение двух матриц
Здравствуйте, выполняю для саморазвития не большой пример по перемножению двух матриц на C#. И когда пытаюсь занести в массив рандомные...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru