Задача
Даны квадратная матрица [latex]A[/latex] порядка [latex]n[/latex] и вектор [latex]b[/latex] с [latex]n[/latex] элементами. Получить вектор:
a) [latex]Ab[/latex];
Размерность матрицы |
Матрица | Вектор | Результирующий вектор |
|||||||||||||||||||||||||||||||||||
2 |
|
|
|
|||||||||||||||||||||||||||||||||||
3 |
|
|
|
|||||||||||||||||||||||||||||||||||
4 |
|
|
|
|||||||||||||||||||||||||||||||||||
5 |
|
|
|
Алгоритм действия достаточно прост:
Вводим размерность матрицы. Потом в цикле вводим саму матрицу. Вводим вектор. Далее идет сам алгоритм матрично-векторного произведения.
Последовательный алгоритм умножения матрицы на вектор может быть представлен следующим образом. Исходные данные: [latex]A[n][m][/latex] – матрицы размерности [latex]n[/latex]× [latex]m[/latex] . [latex]B[m][/latex] – вектор, состоящий из [latex]m[/latex] элементов. Результат: [latex]rezult[n][/latex] – вектор из [latex]n[/latex] элементов.
1 2 3 4 5 6 7 8 9 |
// Поcледовательный алгоритм умножения матрицы на вектор for(int i=0; i<n; i++) { rezult[i]=0; for(int j=0; j<m; j++) { rezult[i]+=A[i][j]*B[j]; } } |
Матрично-векторное умножение – это последовательность вычисления скалярных произведений. Поскольку каждое вычисление скалярного произведения векторов длины [latex]m[/latex] требует выполнения [latex]m[/latex] операций умножения и [latex]m-1[/latex] операций сложения, его трудоемкость порядка [latex]O(m)[/latex]. Для выполнения матрично-векторного умножения необходимо выполнить [latex]n[/latex] операций вычисления скалярного произведения, таким образом, алгоритм имеет трудоемкость порядка [latex]O(nm)[/latex].
Ниже представлен сам код (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 |
#include <iostream> using namespace std; int main() { size_t n,m; cin>>n; //Ввод размерности матрицы; m=n; int A[n][m],B[m],rezult[n]; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { cin>>A[i][j]; //Ввод самой матрицы; } } for(int j=0; j<m; j++) { cin>>B[j]; //Ввод вектора } for(int i=0; i<n; i++) { rezult[i]=0; for(int j=0; j<m; j++) { rezult[i]+=A[i][j]*B[j]; //Последовательный алгоритм умножения матрицы на вектор; } } for(int i=0; i<n; i++) { cout << rezult[i] << endl; //Вывод результирующего вектора; } return 0; } |
Код на Java:
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 |
import java.util.*; import java.lang.*; import java.io.*; class Brovko { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); //Ввод размерности матрицы; int n=in.nextInt(); int[][] A= new int[n][n]; int[] B= new int[n]; int[] rezult= new int[n]; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { A[i][j]=in.nextInt(); //Ввод самой матрицы; } } for(int j=0; j<n; j++) { B[j]=in.nextInt(); //Ввод вектора } for(int i=0; i<n; i++) { rezult[i]=0; for(int j=0; j<n; j++) { rezult[i]+=A[i][j]*B[j]; //Последовательный алгоритм умножения матрицы на вектор; } } for(int i=0; i<n; i++) { System.out.print(" "); System.out.format("%d",rezult[i]); //Вывод результирующего вектора; } } } |
Также, Вы можете воспользоваться ссылкой (C++)/ссылкой (Java) на саму программу.
Кажется все логично. Зачтено.
Ошибок программирования нет, задача решена хорошо, но есть пара мелких замечаний:
1) нарушение структуры отступов (начиная со строки 9),
2) строки
логично объединить в одну — или оставить только format :
или только print
3) и переменную лучше назвать result, а не rezult.