Вопрос № 145814: Добрый вечер уважаемые специалисты. Очень сильно нужна ваша помощь в решении проблемы. Подскажите код программы - матричный калькулятор (MxN). Который умножает, складывает и вычитает две матрицы. Заранее благодарю! ...
Вопрос № 145.814
Добрый вечер уважаемые специалисты. Очень сильно нужна ваша помощь в решении проблемы. Подскажите код программы - матричный калькулятор (MxN). Который умножает, складывает и вычитает две матрицы. Заранее благодарю!
Отправлен: 02.10.2008, 19:21
Вопрос задала: Ютанова (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: realbustard
Здравствуйте, Ютанова! Код операций с матрицами в приложении. Если не понятен алгоритм умножения, смотрите вопрос 145194.
У меня вопросик маленький или прозьба нужен алгоритм "Умножение матрицы на матрицу "
если есть пришлите на covalijenia@mail.ru Я предумал свой алгоритм но он дает ошибки после каждой строки в приложение Описание класса MATRIX и функция сложения " MATRIX * Multiplication_matrixes_on_a_matrix ( MATRIX * , int , int ); " Отправил: Covalijenia, Посетитель Дата отправки: 27.09.2008, 13:40 Поступило ответов: 1 Состояние: В очереди (до окончания - менее суток) Приложение:
<
font color="gray">Код:
class MATRIX /* Definition of a class the Matrix */ { private: /* The limited access */
float * * The_index_on_float; /* The index on the type index float */ int Quantity_of_lines; /* Quantity of lines
*/ int Quantity_of_columns; /* Quantity of columns */ int Error_code; /* Error_code */
public: /* The general access */
MATRIX ( int , int ); /* The designer with two parametres 'Rectangular matrix' */ ~MATRIX ( ); /* The undesigner */
MATRIX * Information_Input ( MATRIX
* , int , int ); /* The funcion 'Information_Input'*/ Conclusion_to_the_element_screen ( MATRIX *, int , int );/* The funcion 'Conclusion_to_the_element_screen'*/ Definition_of_value_of_an_element_i_j ( MATRIX * , int , int );/* The funcion 'Definition_of_value_of_an_element_i_j'*/ MATRIX * Multiplication_of_a_matrix_to_number ( MATRIX * , int , int );/* The funcion 'Multiplication_of_a_matrix_to_number'*/ MATRIX * Subtraction_matrixes_with_a_matrix ( MATRIX
* , int , int );/* The funcion 'Subtraction_matrixes_with_a_matrix'*/ MATRIX * Multiplication_matrixes_on_a_matrix ( MATRIX * , int , int );/* The funcion 'Multiplication_matrixes_on_a_matrix'*/ MATRIX * Addition_matrixes_with_a_matrix ( MATRIX * , int , int );/* The funcion 'Addition_matrixes_with_a_matrix'*/ MATRIX * Memory_removal ( MATRIX * , int , int );/* The funcion 'Memory_removal'*/ }; MATRIX * MATRIX :: Multip
lication_matrixes_on_a_matrix ( MATRIX * INDEX , int size_lines , int size_columns )/* The funcion 'Subtraction_matrixes_with_a_matrix'*/ { int Quantity_of_lines = 0, Quantity_of_columns = 0;/* declare a variable */ cout <<" Enter size of struct 'MATRIX', Quantity_of_lines: ";/* The message to the user */ cin >> Quantity_of_lines; /* Information Input */ cout <<" Enter size of struct 'MATRIX', Quantity_of_columns:
";/* The message to the user */ cin >> Quantity_of_columns; /* Information Input */ float * * The_index_on_float; /* The index on the type index float */ The_index_on_float = new float * [ Quantity_of_lines ];/* Allocation of a file of indexes on type indexes float */ ( The_index_on_float ) ? cout << " Memory has been allocated for a array of indexes of type float COLUMNS'size-"&
lt;< size_lines << "';" : cout << "Memory was not allocated;" << endl;/* The control over memory*/ for ( int i = 0; i < Quantity_of_lines; i++ ) /*The cycle beginning*/ { The_index_on_float [ i ] = new float [ Quantity_of_columns ];/* Allocation of files of type float */ ( The_index_on_float [ i ] ) ?cout << " Memory has been allocated for a type array float LINES'size-" << size_columns <<
"';" << " From COLOMN: "<< i + 1 << endl : cout << "Memory was not allocated;" <<endl;/* The control over memory*/ } for ( i = 0; i < Quantity_of_lines; i++ ) /*The cycle beginning*/ { for ( int j = 0; j < Quantity_of_columns; j++ )/*The cycle beginning*/ { cout << " Please Enter your MATRIX [ " << i + 1 << " ] [ &
quot; << j + 1 << " ] : ";/* The message to the user */ cin >> The_index_on_float [ i ] [ j ];/* Data input*/ } } INDEX -> Conclusion_to_the_element_screen ( INDEX , size_lines , size_columns ); /*To apply function */
cout << " Conclusion to the element screen: " << endl << endl;/* The message to the user */ for ( i = 0; i < Quantity_of_lines; i++ )/*The cycle beginning*/ { cout <<
" ";/* The message to the user */ for ( int j = 0; j < Quantity_of_columns; j++ )/*The cycle beginning*/ { cout << " " << The_index_on_float [ i ] [ j ];/* The message to the user */ } cout << endl << endl; /* The message to the user */ } for ( i = 0; i < size_lines; i++ ) /*The cycle beginning*/
{ for ( int j = 0; j < Quantity_of_columns; j++ )/*The cycle beginning*/ { for ( int z = 0; z < Quantity_of_lines; z++ )/*The cycle beginning*/ { if ( z == 0 ) /*The control of memory */ { INDEX -> The_index_on_float [ i ] [ j ]= INDEX -> The_index_on_float [ i ] [ z ] * The_index_on_float [ z ] [ j ];/*Multiplication*/ } else { INDEX -> The_index_on_float [ i ] [
j ] =INDEX -> The_index_on_float [ i ] [ j ] + ( INDEX -> The_index_on_float [ i ] [ z ] * The_index_on_float [ z ] [ j ] );/*Multiplication*/ } } } } cout << " Conclusion to the element screen: " << endl << endl;/* The message to the user */ for ( i = 0; i < size_lines; i++ ) /*The cycle beginning*/ { cout << " ";/* The message
to the user */ for ( int j = 0; j < Quantity_of_columns; j++ )/*The cycle beginning*/ { cout << " "<< INDEX -> The_index_on_float [ i ] [ j ] ;/* The message to the user */ } cout << endl << endl; /* The message to the user */ } for ( i = 0; i < size_lines; i++ ) /*The cycle beginning*/ { delete [ ] The_index_on_float [ i ]; /*delete*/ } delete [
] The_index_on_float; /*delete*/ return INDEX; }
Ответ № 1 от realbustard, 3-ий класс Здравствуйте, Covalijenia! В приложении код, использующий ф-у умножения матриц, которую ,в принципе, можно оптимизировать, например сделав меньшее количество аргументов. Но остановимся на алгоритме ее работы. Она получает 3 указателя на матрицы: А,В-множители; С-результат; m1..n2-размеры матриц А,В. Перед присваиванием матрице определенного
значения, число, находящееся по адресу этого элемента С[i][j] обнуляется, чтоб мы были уверены, что там ноль, а не что иное. Ну что сначала цикл по i, затем по j, это объяснять не надо. А вот на цикле по k остановлюсь. Каждый элемент результирующей матрицы складывается из суммы произведений элементов 2х матриц, например, если A[2][2] и B[2][2], то С[0][0]=A[0][0]*B[0][0]+A[0][1]*B[1][0]; С[0][1]=A[0][0]*B[0][1]+A[0][1]*B[1][1]; С[1][0]=A[1][0]*B[0][0]+A[1][1]*B[1][0]; С[1][1]=A[1][0]*B[0][1]+A[1][1]*B[1][1]; Можно
заметить, что некоторые значения i и j в многочлене совпадают со значениями i,j в теле цикла, а некоторые отличаются на 1 от них, т.е. можно записать так: C[i][j]=A[i][?]*B[?][j]+A[i][?]*B[?][j]; где: i,j - переменные значения которых, совпадают со значениями i,j в C[i][j]; Знак вопроса - это число, которое увеличивается от 0 до (n1-1) и оно равно числу членов в многочлене, в данном случае 2. Если подставить вместо ? к, то получим: C[i]
[j]=A[i][k]*B[k][j]+A[i][k+1]*B[k+1][j]; Чтобы проще посчитать С[i][j] и был введен 3й цикл по к Общий вид многочлена принял вид: C[i][j]=Сумма_по_k (A[i][k]*B[k][j]) ); где к==0...(n1-1) //k - это итератор, равный n1 и m2. for(int k=0;k<n1;k++){ C[i][j]+=A[i][k]*B[k][j]; } Приложение:
Код:
#include <iostream>
//Подключаются для заполнения массива случайными значениями #include <time.h> #include <stdlib.h>
using namespace std;
//Функция, в которой происходит умножение матриц //В качестве аргументов получает указатели на массивы указателей(наши матрицы) //и размеры матриц(m1..n2) void mult(int** A,int** B,int **C,int m1,int m2,int n1,int n2);
int main() { sr
and(time(NULL));
//Задаем размеры первой матрицы int m1,n1; cout<<"BBEDuTE PA3MEPHOCTb MATPuCbI A: "; cin>>m1>>n1; cout<<endl;
//Задаем размеры второй матрицы int m2,n2; cout<<"BBEDuTE PA3MEPHOCTb MATPuCbI B: "; cin>>m2>>n2; cout<<endl;
//Если количество столбцов первой матрицы равно количеству строк второй матрицы //и все числа положительны, происходит создание матриц if((n1==m2)&(m1>0)&(m2>0)&(n1>0)&(n2>0)){
//Массив
указателей А - первая матрица int** A=new int*[m1];
//Создание, заполнение случайными значениями и вывод на экран for (int i=0;i<m1;i++){ A[i]=new int[n1]; for (int j=0;j<n1;j++){ A[i][j]=rand()%10-5; cout<<A[i][j]<<" "; } cout<<endl; }
cout<<endl;
//Массив указателей B - вторая матрица int** B=new int*[m2];
for (int i=0;i<m2;i++){ B[i]=new int[n2]; for (int j=0;j<n2;j++){ B[i][j]=rand()%10-5; cout<<B[i][j]<<" "; } cout<<endl; }
cout<<endl;
//Матрица С - резулитат умножения А х В int** C=new int*[m1];
void mult(int** A,int** B,int** C,int m1,int m2,int n1,int n2) { //Заполнение матрицы С for(int i=0;i<m1;i++){ C[i]=new int[n2]; for(int j=0;j<n2;j++){ //Перед тем, как будет получено очередное значение элемента С[i][j], // ему надо присвоить значение нуля, иначе будет любое другое ненулевое значение C[i][j]=0;
//k - это итератор, равный n1 и m2. for(int k=0;k<n1;k++){ C[i][j]+=A[i][k]*B[k][j]; } //Печать
элемента cout<<C[i][j]<<" "; } cout<<endl; }
}
Ответил: realbustard, 3-ий класс Дата отправки: 28.09.2008, 00:56
Добавлен вопрос №145194.
--------
∙ Отредактировал: Зенченко Константин Николаевич, Профессор
∙ Дата редактирования: 02.10.2008, 20:32 (время московское)
Приложение:
--------- Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)
Ответ отправил: realbustard (статус: 4-ый класс)
Ответ отправлен: 02.10.2008, 20:01
Отвечает: Denisss Здравствуйте, Ютанова!
В приложении находится текст файла matrix.h (содержит шаблон класса Matrix<Type>). Создавать матрицу можно тремя способами:
Matrix(const size_t &rows, const size_t &cols); rows, cols - количество строк и столбцов в матрице
Matrix(const Matrix<T> &mx); mx - другая матрица того же типа
Matrix(const T *const mx[], const size_t &rows, const size_t &cols); mx - двумерный массив, rows, cols - его размеры (количество строк
и столбцов)
Обращаться к элементам матрицы можно как к обычному двухмерному массиву:
Matrix<int> mx(10,10); mx[5][3] = 15;
Умножение производится как на число, так и на другую матрицу. Для этого имеются:
функция mul
оператор *
оператор *=
Сложение и вычитание производится только с матрицами того же размера, что и исходная:
функции add() и sub()
операторы + и -
операторы += и -=
Пример использования (main.cpp):
Код:
#include <iostream> #include "matrix.h"
using namespace std;
int main () { // Матрица А const int A1[] = {2, 3}; const int A2[] = {1, 0}; const int A3[] = {-1, 3}; const
int *const mxA[] = {A1, A2, A3};
// Матрица Б const int B1[] = {2, 0, 1}; const int B2[] = {1, -2, 2}; const int B3[] = {5, 0, 7}; const int *const mxB[] = {B1, B2, B3};
Matrix<int> a(mxA, 3, 2); cout << "a =
"; a.print();
// Умножение числа на матрицу, матрицы на матрицу и вычитание // Результат заносится в матрицу С Matrix<int> c = (2*a) - (b*a); // Ответ: // 1, -3 // 4, -9 // -5, -30 cout << "
c = 2a - ba =
"; // Выводим результат c.print();
return 0; }
Удачи!
Приложение:
--------- Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн
Ответ отправил: Denisss (статус: Профессор) Россия, Москва ICQ: 281599577 ---- Ответ отправлен: 06.10.2008, 00:48