Форум программистов, компьютерный форум CyberForum.ru

Умножение матриц - C++

Восстановить пароль Регистрация
 
Николай ПЮ
0 / 0 / 0
Регистрация: 06.05.2010
Сообщений: 34
08.06.2010, 20:13     Умножение матриц #1
В чем проблема?
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
#include<iostream>
#include<iomanip>
#include <time.h>
 
using namespace std;
 
char _quit_;
int N;
 
 
int main()
{
cout<<"N in an interval [0..10]: "; cin>>N;
if (N>10 or N<0)
{
         for (int kol=0; kol<20; kol++)
         {
             for(int str=0; str<6; str++)
             {cout <<"!!!DANGER!!!";}
             cout<<endl;
         }
         cin>>_quit_;
         return 0;
}
 
float a[N-1][N-1];
float b[N-1][N-1];
float c[N-1][N-1];
 
for(int i=0; i<N; i++) 
{
 for(int j=0; j<N; j++) 
 {
         c[i][j]=1;
 }
}
 
srand(time(NULL));
for(int number=0; number<N; number++)
{
              
for(int i=0; i<N; i++) 
{
 for(int j=0; j<N; j++) 
 {
         a[i][j]=rand()%10;
         b[i][j]=rand()%10;
 }
}
 
 
 for(int i=0; i<N; i++) 
         {
           for(int j=0; j<N; j++) 
                   {
                        float temp = 0;
 
                        for(int k=0; k<N; k++) 
                                {
                                c[i][j] = +a[i][k]*c[k][i]; 
                                } 
     cout<<c[i][j]<<"      ";
  }
  cout<<endl;
  }
} 
    cin>>_quit_;
    return 0;
}
само задание в файле. Подскажите что не так?
Миниатюры
Умножение матриц  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2010, 20:13     Умножение матриц
Посмотрите здесь:

Умножение матриц C++
Умножение матриц C++
Умножение матриц C++
C++ Умножение треугольных матриц«Методы обработки разреженных матриц»
Умножение матриц C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Николай ПЮ
0 / 0 / 0
Регистрация: 06.05.2010
Сообщений: 34
08.06.2010, 22:56  [ТС]     Умножение матриц #2
кто-нибудь знает?
Gleban_38
 Аватар для Gleban_38
7 / 6 / 1
Регистрация: 03.06.2010
Сообщений: 13
09.06.2010, 01:52     Умножение матриц #3
Доброй ночи! Вот, посмотрите примерный план умножения динамических матриц:
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
#include "stdafx.h"
#include "math.h"
#include "conio.h"
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{   
    int N=0;
    setlocale(LC_ALL,"Russian");
    cout<<"Введите размер массива:\nN=";
    cin>>N;
    while(N<0 || N>10)
    {
        cout<<"Вы ввели слишком большой/малый размер матрицы. Попробуйте еще разик!\nN=";
        cin>>N;
    }
    // Делаем динамический массив под первую матрицу.
    int **MatricaA= new int*[N];
    for(int i=0;i<N;i++)
        MatricaA[i]= new int [N];
    // Делаем динамический массив под вторую матрицу.
    int **MatricaB= new int*[N];
    for(int i=0;i<N;i++)
        MatricaB[i]= new int [N];
    // Делаем динамический массив под результат матрицу.
    int **MatricaC= new int*[N];
    for(int i=0;i<N;i++)
        MatricaC[i]= new int [N];
    // Набираем значения.
    for(int i=0; i<N; i++) 
        for(int j=0; j<N; j++)
        {
            MatricaA[i][j]=rand()%100;
            MatricaB[i][j]=rand()%100;
        }
    // Распечатка Ваших матриц.
    cout<<"\nПервая матрица выглядит:\n";
    for(int i=0; i<N; i++) 
    {
        for(int j=0; j<N; j++) 
        {
            cout<<setw(4)<<MatricaA[i][j];
        }
        cout<<endl;
    }
    cout<<"\nВторая матрица выглядит:\n";
    for(int i=0; i<N; i++) 
    {
        for(int j=0; j<N; j++) 
        {
            cout<<setw(4)<<MatricaB[i][j];
        }
        cout<<endl;
    }
    for(int i=0; i<N; i++) 
        for(int j=0; j<N; j++) 
            MatricaC[i][j]=0;
    for(int k=0; k<N; k++) 
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++) 
                MatricaC[k][i]+=MatricaA[k][j]*MatricaB[j][i];
        }
    cout<<"\n\"Результат\" матрица выглядит:\n";
    for(int i=0; i<N; i++) 
    {
        for(int j=0; j<N; j++) 
            cout<<setw(6)<<MatricaC[i][j];
        cout<<endl<<endl;
    }
    cout<<"Выход из программы успешно завершен.";
    getch();
}
Остается кинуть в файлик. Т.е. Ваша ошибка состояла в "статичности" массивов. Скорее всего компилятор ругался на нехватку памяти и давал очень большие и странные ответы. Остается придумать штуку с количеством матриц. Т.е. при задании N мы должны иметь не три матрицы, а N, которые необходимо перемножить в соответствии с динамикой. Ничего, подумаем!

Добавлено через 53 минуты
Вот что я придумал:
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
#include "stdafx.h"
#include "math.h"
#include "conio.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void main()
{   
    int N=0;
    setlocale(LC_ALL,"Russian");
    cout<<"Введите размер массива:\nN=";
    cin>>N;
    while(N<0 || N>10)
    {
        cout<<"Вы ввели слишком большой/малый размер матрицы. Попробуйте еще разик!\nN=";
        cin>>N;
    }
    // Делаем динамический массив под первую матрицу.
    int **MatricaA= new int*[N];
    for(int i=0;i<N;i++)
        MatricaA[i]= new int [N];
    // Делаем динамический массив под вторую матрицу.
    int **MatricaB= new int*[N];
    for(int i=0;i<N;i++)
        MatricaB[i]= new int [N];
    // Делаем динамический массив под результат матрицу.
    int **MatricaC= new int*[N];
    for(int i=0;i<N;i++)
        MatricaC[i]= new int [N];
    // Делаем динамический массив под результат матрицу.
    int **MatricaD= new int*[N];
    for(int i=0;i<N;i++)
        MatricaD[i]= new int [N];
    for(int QT=0;QT<N;QT++)
    {
        // Набираем значения.
        for(int i=0; i<N; i++) 
            for(int j=0; j<N; j++)
            {
                MatricaA[i][j]=rand()%100;
                MatricaB[i][j]=rand()%100;
            }
        // Распечатка Ваших матриц.
        cout<<"\nПервая матрица выглядит:\n";
        for(int i=0; i<N; i++) 
        {
            for(int j=0; j<N; j++) 
            {
                cout<<setw(4)<<MatricaA[i][j];
            }
            cout<<endl;
        }
        cout<<"\nВторая матрица выглядит:\n";
        for(int i=0; i<N; i++) 
        {
            for(int j=0; j<N; j++) 
            {
                cout<<setw(4)<<MatricaB[i][j];
            }
            cout<<endl;
        }
        for(int i=0; i<N; i++) 
            for(int j=0; j<N; j++) 
                MatricaC[i][j]=0;
        for(int k=0; k<N; k++) 
            for(int i=0; i<N; i++)
                for(int j=0; j<N; j++) 
                    MatricaC[k][i]+=MatricaA[k][j]*MatricaB[j][i];
    cout<<"\n\"Результат\" матрица выглядит:\n";
    for(int i=0; i<N; i++) 
    {
        for(int j=0; j<N; j++) 
            cout<<setw(6)<<MatricaC[i][j];
        cout<<endl<<endl;
    }
    for(int i=0; i<N; i++) 
            for(int j=0; j<N; j++) 
                MatricaD[i][j]=0;
    for(int k=0; k<N; k++)
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++) 
                MatricaD[k][i]+=MatricaC[k][j]*MatricaC[j][i];
    }
    cout<<"\n Конечный \"результат\" матрицы выглядит:\n";
    for(int i=0; i<N; i++) 
    {
        for(int j=0; j<N; j++) 
            cout<<setw(20)<<MatricaD[i][j];
        cout<<endl<<endl;
    }
    getch();
}
Т.е. компилятор прогоняет значения N раз, каждый раз возвращая предыдущую матрицу с предыдущим умножением на раннее ее образовавшие. Если внимательно рассмотреть уравнение задания, то мы увидим, что каждый раз возвращаем квадрат матрица образованной матрицами А и В. Остается скинуть в другую динамику и распечатать! Вот как-то так...
mrMRak
38 / 38 / 3
Регистрация: 02.06.2010
Сообщений: 105
09.06.2010, 12:23     Умножение матриц #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
#include "stdafx.h"
 
#include <time.h>
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{       
    int N=0;
    setlocale(LC_ALL,"Russian");
    cout<<"Введите размер массива:\nN=";
    cin>>N;
    while(N<0 || N>10)
    {
        cout<<"Вы ввели слишком большой/малый размер матрицы. Попробуйте еще разик!\nN=";
        cin>>N;
    }
    // Делаем динамический массив результат.
    int **Result= new int*[N];
    for(int i=0;i<N;i++)
    {
        Result[i]= new int [N];
        for(int j=0;j<N;j++)
                Result[i][j]=0; //обнуляем.
    }
    //для решенеия задания применяем трехмерный масив(запихнув его в двумерный) .
    int **MainArr=new int *[N];
    for (int i=0;i<N;i++)   
        MainArr[i] = new int [N*N];
    for (int i=0;i<N;i++)
    {
        cout<<"масив №"<<i<<"  получает значения:\n";
        for(int j=0;j<N;j++)
        {
            for(int k=0;k<N;k++)
            {
                MainArr[i][k+j*N]=1+rand()%100;//случайные значения.
                Result[j][k]+=MainArr[i][j*N+k];//сложение
                cout<<setw(5)<<MainArr[i][j*N+k];
            }
            cout<<endl;
        }
        cout<<endl<<endl;
    }
    cout<<"результирующий масив: \n";
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
            cout<<setw(5)<<Result[i][j];
        cout<<endl;
    }
    system("PAUSE");
}
Yandex
Объявления
09.06.2010, 12:23     Умножение матриц
Ответ Создать тему
Опции темы

Текущее время: 23:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru