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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.92
Screenly
2 / 2 / 0
Регистрация: 14.03.2011
Сообщений: 27
#1

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

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

Дали задание, написать программу, которая возводит матрицу в куб.
Код
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2011, 22:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возведение матрицы в куб (C++):

Возведение матрицы в степень - C++
Прошу помочь, пожалуйста! Когда возвожу в 3 степень неправильно считает, я не могу увидеть, где ошибка. #include &lt;iostream&gt; using...

Возведение матрицы в степень - C++
Ребята помогите пожалуйста.. Вообще разобраться не могу, а препод сама ничерта не знает.. Надо на C++ 5.0.2 Пусть даны натуральное...

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

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

Возведение матрицы в степень - C++
ребятка,помогите разобраться,ыскакует куча ошибок(надо вывести в степень матрицу #include &lt;stdio.h&gt; /* viod Func (int **a, int n, int...

Возведение матрицы в степень - C++
Здравствуйте! Есть программа, которая возводит матрицу в степень, но через потоки. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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

Не по теме:

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

0
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, вот черт меня дернул переделать немного её)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2011, 00:36
Привет! Вот еще темы с ответами:

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

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

Бинарное возведение матрицы в степень - C++
Подскажите, пожалуйста, как оно реализуется, причем, пишут, что если матрица размером n*n, и нужно возвести ее в степень k - сложность O(...

Потоки Возведение матрицы в степень - C++
Используя объекты класса thread для создания потоков и объекты классов mutex и atomic&lt;T&gt; для безопасного обмена информацией между потоками,...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
14.09.2011, 00:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru