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

Возведение матрицы в куб - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.92
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
09.09.2011, 22: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
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
int main()
{
    int **a, **b, **c;
    int n;
    setlocale(LC_ALL, "Rus");
    cout << "Введите размерность кв. матрицы: ";
    cin >> n;
    a = new int* [n];
    for (int i = 0; i < n; i++)
        a[i] = new int [n];
    b = new int* [n];
    for (int i = 0; i < n; i++)
        b[i] = new int [n];
    c = new int* [n];
    for (int i = 0; i < n; i++)
        c[i] = new int [n];
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            a[i][j] = rand()%10; // заполняем исходную матрицу случайными числами
            b[i][j] = 0;
            c[i][j] = 0;
        }
 
    cout << "Исходная матрица: " << '\n'; // выводим исходную матрицу на экран
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout<<a[i][j]<<'\t';
        cout<<'\n';
    }
 
    for (int i = 0; i < n; i++) // возводим в к вадрат
        for (int j = 0; j < n; j++)
         for (int k = 0; k < n; k++) 
          b[i][j]+=a[i][k]*a[k][j]; 
 
    for (int i = 0; i < n; i++) // теперь в куб
        for (int j = 0; j < n; j++)
         for (int k = 0; k < n; k++) 
           c[i][j]+=b[i][k]*a[k][j];
    
 
    cout << "Матрица в кубе: " << '\n';
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout<<c[i][j]<<'\t';
        cout<<'\n';
    }
 
    system("pause");
    return 0;
}


Как позже выяснилось, это нужно оформить через класс и при этом использовать перегрузку. Прошу вашей помощи, т.к. я не очень сильно понимаю вообще смысл перегрузки, как она работает (это еще можно прочитать) и как её реализовать. Вроде смотрел примеры, читал литературу, а так ничего и не понял ;(
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2011, 14:54     Возведение матрицы в куб #2
Цитата Сообщение от Screenly Посмотреть сообщение
Как позже выяснилось, это нужно оформить через класс и при этом использовать перегрузку.
посмотри мой пост Ошибка при перегрузке +
агерон
 Аватар для агерон
265 / 264 / 33
Регистрация: 12.10.2009
Сообщений: 1,030
10.09.2011, 15:33     Возведение матрицы в куб #3
лови решение писал в MS VS 2008
Вложения
Тип файла: rar MatrixIn3.rar (7.0 Кб, 61 просмотров)
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,655
10.09.2011, 16:42     Возведение матрицы в куб #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
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
/////////////////////////////////////////////////////////////////////////////////////////
//  Возведение матрицы в куб
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef double               T_num;
typedef std::vector<T_num>   T_row;
typedef std::vector<T_row>   T_matr;
/////////////////////////////////////////////////////////////////////////////////////////
class  T_matrix
{
    //-----------------------------------------------------------------------------------
    struct  T_mult_rows
    {
        T_row::value_type  operator() 
            (
                const T_row&  L,
                const T_row&  R
            )
        {
            return std::inner_product
                (
                    L.begin(),
                    L.end(),
                    R.begin(),
                    T_row::value_type()
                );
        }
    };
    //-----------------------------------------------------------------------------------
    T_matr  matr_;
    //-----------------------------------------------------------------------------------
public:    
    //-----------------------------------------------------------------------------------
    T_matrix(int  dim) : matr_( dim, T_row(dim) )
    {
        for(int  i = 0; i < dim; ++i)
        {
            for(int  j = 0; j < dim; ++j)
            {
                matr_[i][j] = rand() % ( (10 / dim + 1) * dim ) + 1;               
            }
        }
    }
    //-----------------------------------------------------------------------------------
    friend  std::ostream& operator<<(std::ostream& os, const T_matrix&  matrix)
    {
        for(T_matr::const_iterator  row_it = matrix.matr_.begin();
            row_it != matrix.matr_.end(); ++row_it)
        {
            std::copy
                (
                    row_it->begin  (),
                    row_it->end    (),
                    std::ostream_iterator<T_num>(os, "\t")
                );
 
            os << std::endl
               << std::endl
               << std::endl;
        }        
        return os;
    }
    //-----------------------------------------------------------------------------------
    T_matrix  transp() const
    {
        T_matrix  matrix_transp = *this;
        for(size_t  i = 0; i < matr_.size(); ++i)
        {
            for(size_t  j = 0; j < matr_.size(); ++j)
            {
                matrix_transp.matr_[i][j] = matr_[j][i];
            }
        }
        return  matrix_transp;
    }
    //-----------------------------------------------------------------------------------
    T_matrix  operator* (const T_matrix&  matrix)
    {
        T_mult_rows  mult_rows;
        T_matrix     matrix_transp  = matrix.transp();
        T_matrix     res_matrix     = *this;
        for(size_t  i = 0; i < matr_.size(); ++i)
        {
            for(size_t  j = 0; j < matr_.size(); ++j)
            {
                res_matrix.matr_[i][j] = mult_rows(matr_[i], matrix_transp.matr_[j]);
            }
        }
        
        return  res_matrix;
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    srand(unsigned(time(0)));
 
    for(;;)
    {
        std::cout << "Введите размерность матрицы: ";
        int  dim = 0;
        std::cin >> dim;
        if(dim <= 0) break;
        T_matrix  m(dim);
        std::cout << "Исходная матрица:"
                  << std::endl
                  << m;
 
        std::cout<< "Матрица в квадрате:"
                  << std::endl
                  << m * m;
                  
        std::cout<< "Матрица в кубе:"
                  << std::endl
                  << m * m * m;
    }
}
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
10.09.2011, 21:43  [ТС]     Возведение матрицы в куб #5
Большое спасибо за решения, но это слишком высокий уровень. Т.е. мы до этого еще не дошли даже. Попробую идею уловить и переписать)
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2011, 21:49     Возведение матрицы в куб #6
Вообще матрицы в степень (особенно большую) возводят по-другому. Сначала находится жорданова нормальная форма с матрицей перехода к другому базису, а затем уже возвести в степень - пара мгновений.
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
10.09.2011, 22:53  [ТС]     Возведение матрицы в куб #7
Цитата Сообщение от Thinker Посмотреть сообщение
Вообще матрицы в степень (особенно большую) возводят по-другому. Сначала находится жорданова нормальная форма с матрицей перехода к другому базису, а затем уже возвести в степень - пара мгновений.
Матрицу 3 раза саму на себя можно и без жордановой формы. А про сложность - я имел ввиду код)
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2011, 22:55     Возведение матрицы в куб #8
Цитата Сообщение от Screenly Посмотреть сообщение
Матрицу 3 раза саму на себя можно и без жордановой формы. А про сложность - я имел ввиду код)
А имел ввиду большие степени, про ваш алгоритм я ничего не говорю. Просто на всякий случай
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
10.09.2011, 23:00  [ТС]     Возведение матрицы в куб #9
Цитата Сообщение от Thinker Посмотреть сообщение
А имел ввиду большие степени, про ваш алгоритм я ничего не говорю. Просто на всякий случай
Слава богу больших степеней не будет)
-=ЮрА=-
Заблокирован
Автор FAQ
10.09.2011, 23:25     Возведение матрицы в куб #10
Screenly, я не просто так постил в том топике привел перегрузку операторов сложения и умножения для матриц,и в виду имел трехкратное перемножение...
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
13.09.2011, 00:53  [ТС]     Возведение матрицы в куб #11
Программу сделал. Помогите пожалуйста доработать. Она возводит только в квадрат. А вот как возвести в куб я не могу понять ;(
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
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
#include <time.h>
 
using namespace std;
 
class Matrix
{
private:
    int **a; // двумерный динамический массив
    int n; // количество элементов массива
public:
    Matrix() { n = 0; a = NULL; srand(time(NULL)); }; // конструктор по умолчанию
    Matrix(int m) // конструктор
    {
        srand(time(NULL));
        n=m;
        if (n <= 0) // проверяем, что размерность массива != 0, иначе выдаем ошибку
        {
            n = 0;
            a = NULL;
            cout << "ОШИБКА! Размерность массива меньше или равно 0" << endl;
        } else { // если n > 0, то создаем массив и обнуляем его
            a = new int * [n];
            for (int i = 0; i < n; i++)
             {
                 a[i] = new int [n];
                 for (int j = 0; j < n; j++)
                     a[i][j] = 0;
            };
        };
    }
    
    void read() // функция чтения, получает размерность массива (вводится пользователем с клавиатуры)
    {
        cout << "Введите размерность матрицы: ";
        cin>>n;
        if (n > 0) {
            a = new int * [n];
            for (int i = 0; i < n; i++)
             {
                 a[i] = new int [n];
                 for (int j = 0; j < n; j++)
                     a[i][j] = 0;
            };
        } else { a = NULL; cout << "ОШИБКА! Вы ввели неправильную размерность матрицы!" << endl; };
    }
    void random() // функция заполнения массива случайными числами
    {
        cout << "Квадратная матрица в кубе: " << endl; // выводим начальную матрицу на экран
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                a[i][j]=rand()%10;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
                cout << a[i][j] << '\t';
            cout << '\n';
        };
    }
    void print() 
    {
        cout << "Квадратная матрица в кубе: " << endl; // выводим результат
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
                cout<<a[i][j]<<'\t';
            cout<<'\n';
        };
        
    }
 
    Matrix operator * (const Matrix&) // перегрузка оператора *
    {
        Matrix c(n);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < n; k++)
                    c.a[i][j]+=a[i][k]*a[k][j];
        return c;
    }
 
};
int main ()
{
    setlocale(LC_ALL, "Rus"); 
    Matrix a,c;
    a.read();
    a.random();
    c=a*a;
    c.print();
    system("pause");
}
-=ЮрА=-
Заблокирован
Автор FAQ
13.09.2011, 09:15     Возведение матрицы в куб #12
Цитата Сообщение от Screenly Посмотреть сообщение
Она возводит только в квадрат. А вот как возвести в куб я не могу понять ;(
Цитата Сообщение от Screenly Посмотреть сообщение
c=a*a;
C++
1
2
d = c*a;//или же
c = (a*a)*a;
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
13.09.2011, 17:21  [ТС]     Возведение матрицы в куб #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
2
d = c*a;//или же
c = (a*a)*a;
не работают оба метода.

Добавлено через 7 часов 35 минут
Цитата Сообщение от Screenly Посмотреть сообщение
не работают оба метода.
А возведение в куб должно выглядеть так
matr *cub(matr *A)
{return A*A*A;}

как это сделать? и как это впихнуть в алгоритм программы (код выше на 1 пост, не в начале топика).
Nameless One
13.09.2011, 17:34
  #14

Не по теме:

Действия по вводу-выводу обычно отделяют от логики класса

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2011, 00:36     Возведение матрицы в куб
Еще ссылки по теме:

C++ Возведение матрицы в степень
Возведение матрицы в степень C++
C++ Возведение матрицы в степень

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

Или воспользуйтесь поиском по форуму:
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
14.09.2011, 00:36  [ТС]     Возведение матрицы в куб #15
Полностью рабочий код. Программа может возводить как в куб, так и в четвертую степень. Если дописать еще одно умножение, то 5. И тд, и тп.

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
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
class Matrix
{
private:
    int **a; // динамический двумерный массив
    int n; // размерность массива
public:
    Matrix() { n = 0; a = NULL; }; // конструктор по умолчанию
    Matrix(int m) // конструктор
    {
        n=m;
        if (n <= 0) // проверяем размерность массива. если <=0, то выводим ошибку и обнуляем массив. 
        {
            n = 0;
            a = NULL;
            cout << "ОШИБКА! Размерность матрицы < или = 0" << endl;
        } else { // если размерность > 0, то выделяем память
            a = new int * [n];
            for (int i = 0; i < n; i++)
             {
                 a[i] = new int [n];
                 for (int j = 0; j < n; j++)
                     a[i][j] = 0;
            };
        };
    }
    
    void read() // функция чтения. Получает размерность массива (пользователь вводит с клавиатуры) и выделяет память под него.
    {
        cin>>n;
        if (n > 0) {
            a = new int * [n];
            for (int i = 0; i < n; i++)
             {
                 a[i] = new int [n];
                 for (int j = 0; j < n; j++)
                     a[i][j] = 0;
            };
        } else { n = 0; a = NULL; cout << "ОШИБКА! Размерность матрицы < или = 0" << endl; }; // если размерность < или = 0, то выводим ошибку и обнуляем массив
    }
    void random() // функция заполнения массива случайными числами
    {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                a[i][j]=rand()%10;
    }
    void print() // функция вывода результата на экран
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
                cout<<a[i][j]<<'\t';
            cout << endl;
        };
        
    }
 
    Matrix& operator=(const Matrix &m) // перегрузка оператора присваивания
    {
        n=m.n;
        a=new int * [n];
 
        for (int i = 0; i < n; i++)
        {
            a[i] = new int [n];
            for (int j = 0; j < n; j++)
                a[i][j] = 0;
        };
        
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                a[i][j] = m.a[i][j];
        return *this;
    }
 
    Matrix operator *=(const Matrix& m)
    {
        int **tmp = new int * [n];
        for (int i = 0; i < n; i++)
        {
            tmp[i] = new int [n];
            for (int j = 0; j <n; j++)
                tmp[i][j] = 0;
        };
 
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < n; k++)
                    tmp[i][j]+=a[i][k]*m.a[k][j];
        a = tmp;
        n = m.n;
        return *this;
    }
 
    Matrix operator * (const Matrix& m)
    {
    Matrix cub(Matrix *m);
    return m * m * m;
    }
 
 
};
 
 
int main ()
{
    setlocale(LC_ALL, "Rus");
    Matrix B;
    cout << "Введите размерность матрицы: ";
    B.read();
    cout << endl;
    cout << "Исходная матрица: " << endl;
    B.random();
    B.print();
    cout << endl;
    B=cub(m);
    cout << "Матрица в 3 степени: " << endl;
    B.print();
    cout << endl;
    cout << "Матрица в 4 степени: " << endl;
    B=cub(m)*m;
    B.print();
    cout << endl;
    system("pause");
}
Добавлено через 1 час 47 минут
Оу. Выложил старую версию, здесь есть бага с return m*m*m; Пожалуйста помогите её выловить, новый файл с решенным багом случайно делитнул ;( (что поделать, мозг закипает, 2 ночи уже. А готовая программа была в 23-20, вот черт меня дернул переделать немного её)
Yandex
Объявления
14.09.2011, 00:36     Возведение матрицы в куб
Ответ Создать тему
Опции темы

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