Умножение матриц c программа

Умножение матриц c программа

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

Поэтому в приведённом ниже фрагменте кода задаём ввод пользователем одной и той же переменной — n числа столбцов матрицы А и числа строк матрицы В. Затем вводятся число строк матрицы А и число столбцов матрицы В.

Код C++

cout "Enter cols count in matrix A and rows count in matrix B: " ;

cout "Enter rows count in matrix A: " ;

cout "Enter cols count in matrix B: " ;

Далее выделяем память под два динамических двумерных массива — соответственно матрицы А и В. Организуем ввод пользователем элементов этих двух матриц и вывод на экран заполненных матриц.

Код C++

int **aArr = new int *[m];

for (i = 0; i new int [n];

for (i = 0; i for (j = 0; j "Enter arrays elements of matrix A " ;

cout "Matrix A: " for (i = 0; i for (j = 0; j int **bArr = new int *[n];

for (i = 0; i new int [q];

for (i=0; i for (j = 0; j "Enter arrays elements of matrix B " ;

cout "Matrix B: " for (i = 0; i for (j = 0; j Код C++

int **cArr = new int *[i];

for (i = 0; i new int [j];

Затем — цикл вычисления произведения двух матриц по формуле . В цикле происходит суммирование всех произведений элементов, предусмотренной формулой.

Код C++

int **cArr = new int *[i];

for (i = 0; i new int [j];

for (i = 0; i for (j = 0; j for ( int k = 0; k Код C++

cout "Matrix C: " for (i = 0; i for (j = 0; j Код C++

using namespace std;

cout "Enter cols count in matrix A and rows count in matrix B: " ;

cout "Enter rows count in matrix A: " ;

cout "Enter cols count in matrix B: " ;

int **aArr = new int *[m];

for (i = 0; i new int [n];

for (i = 0; i for (j = 0; j "Enter arrays elements of matrix A " ;

cout "Matrix A: " for (i = 0; i for (j = 0; j int **bArr = new int *[n];

for (i = 0; i new int [q];

for (i=0; i for (j = 0; j "Enter arrays elements of matrix B " ;

cout "Matrix B: " for (i = 0; i for (j = 0; j int **cArr = new int *[i];

for (i = 0; i new int [j];

for (i = 0; i for (j = 0; j for ( int k = 0; k "Matrix C: " for (i = 0; i for (j = 0; j return 0;

Это пошаговое руководство демонстрирует использование C++ AMP для ускорения выполнения Перемножение матриц. This step-by-step walkthrough demonstrates how to use C++ AMP to accelerate the execution of matrix multiplication. Появится два алгоритма и один без заполнения с мозаичное заполнение. Two algorithms are presented, one without tiling and one with tiling.

Предварительные требования Prerequisites

Перед началом работы Before you start:

Убедитесь, что вы используете по крайней мере Windows 7 или Windows Server 2008 R2. Make sure that you are running at least Windows 7, or Windows Server 2008 R2.

Создание проекта To create the project

Инструкции по созданию нового проекта зависит от установленной версии Visual Studio. Instructions for creating a new project vary depending on which version of Visual Studio you have installed. Убедитесь, что у вас есть выбора версий в верхнем левом углу задайте правильную версию. Make sure you have the version selector in the upper left set to the correct version.

Чтобы создать проект в Visual Studio 2019 г. To create the project in Visual Studio 2019

В строке меню выберите файл > New > проекта открыть создайте новый проект диалоговое окно. On the menu bar, choose File > New > Project to open the Create a New Project dialog box.

В верхней части диалогового окна, задайте языка для C++, задайте платформы для Windowsи задайте типпроекта для консоли. At the top of the dialog, set Language to C++, set Platform to Windows, and set Project type to Console.

В отфильтрованном списке типов проектов выберите пустой проект выберите Далее. From the filtered list of project types, choose Empty Project then choose Next. На следующей странице введите MatrixMultiply в имя поле для указания имени проекта и указать расположение проекта, при необходимости. In the next page, enter MatrixMultiply in the Name box to specify a name for the project, and specify the project location if desired.

Выберите создать кнопку, чтобы создать клиентский проект. Choose the Create button to create the client project.

В обозревателе решений, откройте контекстное меню для исходные файлы, а затем выберите добавить > новый элемент. In Solution Explorer, open the shortcut menu for Source Files, and then choose Add > New Item.

В Добавление нового элемента выберите файл C++ (.cpp), введите MatrixMultiply.cpp в имя поле, а затем выберите Добавление кнопки. In the Add New Item dialog box, select C++ File (.cpp), enter MatrixMultiply.cpp in the Name box, and then choose the Add button.

Читайте также:  Использует мобильный аутентификатор менее 7 дней

Создание проекта в Visual Studio 2017 или 2015 To create a project in Visual Studio 2017 or 2015

В строке меню в Visual Studio, выберите файл > New > проекта. On the menu bar in Visual Studio, choose File > New > Project.

В разделе установленные в области «Шаблоны» выберите Visual C++. Under Installed in the templates pane, select Visual C++.

Выберите пустой проект, введите MatrixMultiply в имя поле, а затем выберите ОК кнопки. Select Empty Project, enter MatrixMultiply in the Name box, and then choose the OK button.

Нажмите кнопку Далее. Choose the Next button.

В обозревателе решений, откройте контекстное меню для исходные файлы, а затем выберите добавить > новый элемент. In Solution Explorer, open the shortcut menu for Source Files, and then choose Add > New Item.

В Добавление нового элемента выберите файл C++ (.cpp), введите MatrixMultiply.cpp в имя поле, а затем выберите Добавление кнопки. In the Add New Item dialog box, select C++ File (.cpp), enter MatrixMultiply.cpp in the Name box, and then choose the Add button.

Умножение без заполнения Multiplication without tiling

В этом разделе описано рассмотрим умножения двух матриц, А и Б, которые определяются следующим образом: In this section, consider the multiplication of two matrices, A and B, which are defined as follows:

Объект является матрицу 3 x 2, а B — матрица 2 x 3. A is a 3-by-2 matrix and B is a 2-by-3 matrix. Результат умножения A, B является следующая матрица 3 x 3. The product of multiplying A by B is the following 3-by-3 matrix. Продукт вычисляется путем умножения строки типа по столбцам B поэлементно. The product is calculated by multiplying the rows of A by the columns of B element by element.

Для умножения без использования C++ AMP To multiply without using C++ AMP

Откройте MatrixMultiply.cpp и используйте следующий код, чтобы заменить существующий код. Open MatrixMultiply.cpp and use the following code to replace the existing code.

Алгоритм представляет собой простую реализацию, определения Перемножение матриц. The algorithm is a straightforward implementation of the definition of matrix multiplication. Он не использует любые алгоритмы параллельных или потоками для уменьшения времени вычислений. It does not use any parallel or threaded algorithms to reduce the computation time.

В строке меню выберите Файл > Сохранить все. On the menu bar, choose File > Save All.

Выберите F5 сочетания клавиш, чтобы начать отладку и проверьте, правильно ли выходные данные. Choose the F5 keyboard shortcut to start debugging and verify that the output is correct.

Выберите ввод выход из приложения. Choose Enter to exit the application.

Умножение с помощью C++ AMP To multiply by using C++ AMP

В MatrixMultiply.cpp, добавьте следующий код перед main метод. In MatrixMultiply.cpp, add the following code before the main method.

AMP код напоминает код, не AMP. The AMP code resembles the non-AMP code. Вызов parallel_for_each запускает один поток для каждого элемента в product.extent и заменяет for циклы для строк и столбцов. The call to parallel_for_each starts one thread for each element in product.extent , and replaces the for loops for row and column. Значение ячейки в строке и столбце доступен в idx . The value of the cell at the row and column is available in idx . Можно получить доступ к элементы array_view объекта, либо при помощи [] оператор и переменная индекса, или () оператор и переменных строк и столбцов. You can access the elements of an array_view object by using either the [] operator and an index variable, or the () operator and the row and column variables. В этом примере оба метода. The example demonstrates both methods. array_view::synchronize Метод копирует значения product переменной обратно productMatrix переменной. The array_view::synchronize method copies the values of the product variable back to the productMatrix variable.

Добавьте следующий include и using инструкций в верхней части MatrixMultiply.cpp. Add the following include and using statements at the top of MatrixMultiply.cpp.

Изменить main метод для вызова MultiplyWithAMP метод. Modify the main method to call the MultiplyWithAMP method.

Нажмите клавишу Ctrl+F5 сочетания клавиш, чтобы начать отладку и проверьте, правильно ли выходные данные. Press the Ctrl+F5 keyboard shortcut to start debugging and verify that the output is correct.

Нажмите клавишу пробел выход из приложения. Press the Spacebar to exit the application.

Умножение с мозаичное заполнение Multiplication with tiling

Мозаичное заполнение — это метод, в котором секционировать данные на подмножества одинакового размера, которые известны как плитки. Tiling is a technique in which you partition data into equal-sized subsets, which are known as tiles. При использовании мозаичного заполнения, изменить три вещи. Three things change when you use tiling.

Можно создать tile_static переменные. You can create tile_static variables. Доступ к данным в tile_static пространство может быть много раз быстрее, чем доступ к данным в глобальной области. Access to data in tile_static space can be many times faster than access to data in the global space. Экземпляр tile_static переменная создается для каждого элемента мозаики, и все потоки в мозаике имеют доступ к этой переменной. An instance of a tile_static variable is created for each tile, and all threads in the tile have access to the variable. Основное преимущество мозаичного замощения — выигрыш в производительности из-за tile_static доступа. The primary benefit of tiling is the performance gain due to tile_static access.

Читайте также:  Xiaomi mi5 64gb black

Можно вызвать tile_barrier::wait метода все потоки в одну плитку в указанной строке кода. You can call the tile_barrier::wait method to stop all of the threads in one tile at a specified line of code. Не гарантирует порядок, в котором будут выполняться потоки, только что все потоки в одну плитку останавливается на вызове tile_barrier::wait продолжения выполнения. You cannot guarantee the order that the threads will run in, only that all of the threads in one tile will stop at the call to tile_barrier::wait before they continue execution.

У вас есть доступ к индексу потока по отношению к всего array_view объекта и индексу относительно плитки. You have access to the index of the thread relative to the entire array_view object and the index relative to the tile. С помощью локального индекса, может сделать ваш код проще читать и отлаживать. By using the local index, you can make your code easier to read and debug.

Чтобы воспользоваться преимуществами мозаичного заполнения в Перемножение матриц, необходимо разделить матрицы плитки алгоритм, а затем скопировать данные плиток в tile_static переменные для более быстрого доступа. To take advantage of tiling in matrix multiplication, the algorithm must partition the matrix into tiles and then copy the tile data into tile_static variables for faster access. В этом примере матрицы разделена на submatrices одинакового размера. In this example, the matrix is partitioned into submatrices of equal size. Продукт находится путем умножения submatrices. The product is found by multiplying the submatrices. Две матрицы и продуктов в этом примере являются: The two matrices and their product in this example are:

Матрицы секционируются в матрицах четыре 2 x 2, которые определяются следующим образом: The matrices are partitioned into four 2×2 matrices, which are defined as follows:

Произведение A и B теперь могут быть записаны и вычисляется следующим образом: The product of A and B can now be written and calculated as follows:

Так как матрицы a через h матрицы 2 x 2, все продукты и суммы значений их также матрицы 2 x 2. Because matrices a through h are 2×2 matrices, all of the products and sums of them are also 2×2 matrices. Также следует, что продукт A и B является матрицу 4 x 4 должным образом. It also follows that the product of A and B is a 4×4 matrix, as expected. Чтобы быстро проверить алгоритм, вычисления значения параметра элемент в первой строке и первом столбце в продукте. To quickly check the algorithm, calculate the value of the element in the first row, first column in the product. В примере, который будет иметь значение элемента в первой строке и первом столбце ae + bg . In the example, that would be the value of the element in the first row and first column of ae + bg . Вам только нужно рассчитать первый столбец, первая строка ae и bg каждого термина. You only have to calculate the first column, first row of ae and bg for each term. Это значение для ae является (1 * 1) + (2 * 5) = 11 . That value for ae is (1 * 1) + (2 * 5) = 11 . Значение для bg является (3 * 1) + (4 * 5) = 23 . The value for bg is (3 * 1) + (4 * 5) = 23 . Конечное значение будет 11 + 23 = 34 , которое является верным. The final value is 11 + 23 = 34 , which is correct.

Для реализации этого алгоритма, код: To implement this algorithm, the code:

Использует tiled_extent вместо объекта extent объекта в parallel_for_each вызова. Uses a tiled_extent object instead of an extent object in the parallel_for_each call.

Использует tiled_index вместо объекта index объекта в parallel_for_each вызова. Uses a tiled_index object instead of an index object in the parallel_for_each call.

Создает tile_static переменные для хранения submatrices. Creates tile_static variables to hold the submatrices.

Использует tile_barrier::wait метод потоков для расчета продуктов submatrices. Uses the tile_barrier::wait method to stop the threads for the calculation of the products of the submatrices.

Умножение с помощью AMP и мозаичного заполнения To multiply by using AMP and tiling

В MatrixMultiply.cpp, добавьте следующий код перед main метод. In MatrixMultiply.cpp, add the following code before the main method.

В этом примере значительно отличается от примера без заполнения. This example is significantly different than the example without tiling. В коде используются следующие основные действия: The code uses these conceptual steps:

Копировать элементы плитки [0,0] a в locA . Copy the elements of tile[0,0] of a into locA . Копировать элементы плитки [0,0] b в locB . Copy the elements of tile[0,0] of b into locB . Обратите внимание, что product выполняется мозаичное заполнение, не a и b . Notice that product is tiled, not a and b . Таким образом, использовать глобальный индексы для доступа к a, b , и product . Therefore, you use global indices to access a, b , and product . Вызов tile_barrier::wait важно. The call to tile_barrier::wait is essential. Останавливает все потоки в плитке до оба locA и locB заполняются. It stops all of the threads in the tile until both locA and locB are filled.

Читайте также:  Age of earth 2

Умножьте locA и locB и помещать результаты в product . Multiply locA and locB and put the results in product .

Копировать элементы плитки [0,1] a в locA . Copy the elements of tile[0,1] of a into locA . Копировать элементы плитки [1,0] b в locB . Copy the elements of tile [1,0] of b into locB .

Умножьте locA и locB и добавить их к результатам, которые уже product . Multiply locA and locB and add them to the results that are already in product .

Умножение плитки [0,0] завершена. The multiplication of tile[0,0] is complete.

Повторите для других трех плиток. Repeat for the other four tiles. Имеется индексирование не специально для плитки, а потоки могут выполняться в любом порядке. There is no indexing specifically for the tiles and the threads can execute in any order. Так как каждый поток выполняется, tile_static переменные создаются для каждой плитки соответствующим образом и вызов tile_barrier::wait управляет выполнением программы. As each thread executes, the tile_static variables are created for each tile appropriately and the call to tile_barrier::wait controls the program flow.

Внимательно просмотреть алгоритм, обратите внимание, что каждый submatrix загружается в tile_static памяти дважды. As you examine the algorithm closely, notice that each submatrix is loaded into a tile_static memory twice. Эта передача данных времени. That data transfer does take time. Тем не менее когда данные находятся в tile_static памяти, доступ к данным осуществляется гораздо быстрее. However, once the data is in tile_static memory, access to the data is much faster. Поскольку вычисление продуктов требует повторного доступа к значениям в submatrices, является увеличение общей производительности. Because calculating the products requires repeated access to the values in the submatrices, there is an overall performance gain. Для каждого алгоритма службы "Экспериментирование" необходим для поиска оптимального алгоритма и размер плитки. For each algorithm, experimentation is required to find the optimal algorithm and tile size.

В примерах не AMP и не плитки, каждый элемент A и B выполняется четыре раза из глобальной памяти, для которого требуется вычислить продукта. In the non-AMP and non-tile examples, each element of A and B is accessed four times from the global memory to calculate the product. В примере плитки, каждому элементу осуществляется дважды из глобальной памяти и четыре раза tile_static памяти. In the tile example, each element is accessed twice from the global memory and four times from the tile_static memory. Это не прирост производительности. That is not a significant performance gain. Тем не менее если A и B были 1024 x 1024 матрицы и размер мозаики были 16, отсутствует прирост производительности. However, if the A and B were 1024×1024 matrices and the tile size were 16, there would be a significant performance gain. В этом случае каждый элемент будет необходимо скопировать в tile_static памяти только 16 раз доступ к ним из tile_static памяти раз на 1024. In that case, each element would be copied into tile_static memory only 16 times and accessed from tile_static memory 1024 times.

Измените основной метод для вызова MultiplyWithTiling метод, как показано. Modify the main method to call the MultiplyWithTiling method, as shown.

Нажмите клавишу Ctrl+F5 сочетания клавиш, чтобы начать отладку и проверьте, правильно ли выходные данные. Press the Ctrl+F5 keyboard shortcut to start debugging and verify that the output is correct.

Нажмите клавишу пространства панели, чтобы выйти из приложения. Press the Space bar to exit the application.

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Алгоритм умножения матриц на языке C

В данной статье мы рассмотрим алгоритм умножения матриц и приведем его код на языке программирования С.

Умножать можно такие прямоугольные матрицы, в которых число столбцов первой матрицы равно числу строк во второй (про такие матрицы говорят, что их форма согласована), то есть их размерность должна быть следующая: матрица A[m, n], матрица B[n, q].

В результате умножения получится матрица C[m, q]:

элементы которой находятся по формуле:

На языке C алгоритм умножения матриц может быть записан следующим образом:

Ссылка на основную публикацию
Тор браузер андроид 4pda
Браузер Тор доступен не только для компьютеров и ноутбуков под управлением различных операционных систем. Разработчики обеспокоились и его выпуском для...
Телефон греется и тормозит что делать
Почему тормозит устройство на Andro >Прежде чем перейти непосредственно к решению проблем, стоит указать на их причины. Зная о том,...
Телефон завис на загрузке андроид
В результате поломки аппаратной части или сбоя в работе ОС любой Android-смартфон может перестать реагировать на кнопку включения. Частой можно...
Тор браузер без установки
Tor Browser (ранее он назывался Tor Browser Bundle) – наиболее защищенный интернет-обозреватель из представленных в настоящий момент. Ввиду высокой популярности...
Adblock detector