Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 27
1

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

09.09.2011, 22:13. Показов 5292. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дали задание, написать программу, которая возводит матрицу в куб.
Код
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;
}


Как позже выяснилось, это нужно оформить через класс и при этом использовать перегрузку. Прошу вашей помощи, т.к. я не очень сильно понимаю вообще смысл перегрузки, как она работает (это еще можно прочитать) и как её реализовать. Вроде смотрел примеры, читал литературу, а так ничего и не понял ;(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2011, 22:13
Ответы с готовыми решениями:

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

Возведение матрицы в степень
ребятка,помогите разобраться,ыскакует куча ошибок(надо вывести в степень матрицу #include...

Возведение матрицы в степень
Помогите пож понять проблему #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; ...

Возведение матрицы в степень
Прошу помочь, пожалуйста! Когда возвожу в 3 степень неправильно считает, я не могу увидеть, где...

14
Заблокирован
Автор FAQ
10.09.2011, 14:54 2
Цитата Сообщение от Screenly Посмотреть сообщение
Как позже выяснилось, это нужно оформить через класс и при этом использовать перегрузку.
посмотри мой пост Ошибка при перегрузке +
0
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
10.09.2011, 15:33 3
лови решение писал в MS VS 2008
Вложения
Тип файла: rar MatrixIn3.rar (7.0 Кб, 64 просмотров)
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
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;
    }
}
0
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 27
10.09.2011, 21:43  [ТС] 5
Большое спасибо за решения, но это слишком высокий уровень. Т.е. мы до этого еще не дошли даже. Попробую идею уловить и переписать)
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2011, 21:49 6
Вообще матрицы в степень (особенно большую) возводят по-другому. Сначала находится жорданова нормальная форма с матрицей перехода к другому базису, а затем уже возвести в степень - пара мгновений.
0
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 27
10.09.2011, 22:53  [ТС] 7
Цитата Сообщение от Thinker Посмотреть сообщение
Вообще матрицы в степень (особенно большую) возводят по-другому. Сначала находится жорданова нормальная форма с матрицей перехода к другому базису, а затем уже возвести в степень - пара мгновений.
Матрицу 3 раза саму на себя можно и без жордановой формы. А про сложность - я имел ввиду код)
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.09.2011, 22:55 8
Цитата Сообщение от Screenly Посмотреть сообщение
Матрицу 3 раза саму на себя можно и без жордановой формы. А про сложность - я имел ввиду код)
А имел ввиду большие степени, про ваш алгоритм я ничего не говорю. Просто на всякий случай
0
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 27
10.09.2011, 23:00  [ТС] 9
Цитата Сообщение от Thinker Посмотреть сообщение
А имел ввиду большие степени, про ваш алгоритм я ничего не говорю. Просто на всякий случай
Слава богу больших степеней не будет)
0
Заблокирован
Автор FAQ
10.09.2011, 23:25 10
Screenly, я не просто так постил в том топике привел перегрузку операторов сложения и умножения для матриц,и в виду имел трехкратное перемножение...
0
2 / 2 / 1
Регистрация: 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");
}
0
Заблокирован
Автор FAQ
13.09.2011, 09:15 12
Цитата Сообщение от Screenly Посмотреть сообщение
Она возводит только в квадрат. А вот как возвести в куб я не могу понять ;(
Цитата Сообщение от Screenly Посмотреть сообщение
c=a*a;
C++
1
2
d = c*a;//или же
c = (a*a)*a;
0
2 / 2 / 1
Регистрация: 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 пост, не в начале топика).
0
Nameless One
13.09.2011, 17:34
  #14

Не по теме:

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

0
2 / 2 / 1
Регистрация: 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, вот черт меня дернул переделать немного её)
0
14.09.2011, 00:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2011, 00:36
Помогаю со студенческими работами здесь

Возведение матрицы в степень
Здравствуйте! Есть программа, которая возводит матрицу в степень, но через потоки. #include...

Возведение матрицы в степень
Всем привет! У меня не правильно работает возведение матрицы в степень. Не могу понять, почему....

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

Возведение матрицы в степень
Можете исправить? using namespace std; void main () { setlocale( LC_ALL,&quot;Russian&quot; ); int...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru