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

Матрица.. - C++

Восстановить пароль Регистрация
 
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
30.06.2010, 16:33     Матрица.. #1
Всем приветя вот столкнулся с какой проблемой.Мне нужно написать в программе, чтобы рекурсия возвращала МАТРИЦУ.Как бы я не пытался это сделать, не получается(помогите, кто может.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2010, 16:33     Матрица..
Посмотрите здесь:

C++ матрица...(
C++ Матрица...
Квадратная матрица А называется ортогональной,если А^T=А^-1. Определить, является ли заданная матрица А(n,n) ортогональной. C++
C++ Даны квадратная матрица A порядка n и вектор с n элементами. Получить вектор: (A=E)b, где E единичная матрица порядка n
Дана матрица целых чисел, из n строк и n столбцов (n < = 100).Определить является ли матрица нулевой (состоит из одних нулей) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Усков Борис
2 / 2 / 0
Регистрация: 27.06.2010
Сообщений: 27
30.06.2010, 16:52     Матрица.. #2
У Вас вероятно переполняется стек (рекурсивные подпрограммы вообще очень быстро заполняют стек своими адресами возврата). Вероятно необходимо передать матрицу не по значению, а по ссылке тогда в стек будет помещена не сама матрица, а ее адрес в оперативной памяти.
Примечание: в данном случае будет изменен массив в памяти, а не будет возвращена его измененная локальная копия в стеке.
В паскале и C++ возможна также передача константного указателя когда в подпрограмму передается адрес переменной, но ее значение нельзя изменить в подпрограмме
Если что спрашивайте
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
30.06.2010, 16:59  [ТС]     Матрица.. #3
Задача такая: Дана матрица А порядка m, и натуральное число n, надо вычислить E+A+A^2+.....+A^n с помощью рекурсии.
У меня получается, что рекурсивная функция должна возвращать матрицу, а насколько я знаю так делать нельзя (или даже невозможно).
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
30.06.2010, 17:08     Матрица.. #4
Цитата Сообщение от Я вас люблю Посмотреть сообщение
а насколько я знаю так делать нельзя (или даже невозможно).
таки да... Вот поэтому в рекурсивную функцию передавайте указатель/ссылку на матрицу.
requester
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 40
30.06.2010, 17:16     Матрица.. #5
У меня та же проблема. Чтобы применить рекурсию к матрице надо чтобы она явно возвращала матрицу (в return), а не просто перезаписывала ее в процессе выполнения.
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
30.06.2010, 17:22     Матрица.. #6
попробуйте создать простенький класс содержащий матрицу. Объект вернуть можно уж точно
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
30.06.2010, 17:26  [ТС]     Матрица.. #7
Приведите хотя б простейший пример, применительно к этой задаче..я просто не знаю, как это(
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
30.06.2010, 17:40     Матрица.. #8
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
//простейший пример
#include "stdafx.h"
#include <iostream.h>
 
class matrix//создания класа matrix
{
public:
    matrix(){};
    matrix(int f[3][3]) {matr=f;}//конструктор для заполениния матрици
    int matr[3][3];// клас содержит двумерный массив выступающий матрицей
};
matrix funk(matrix);
 
int main()
{
    int a[3][3]={0};
    matrix g(a);//создается обьект класса
    g=funk(g);
    return 0;
}
 
matrix funk(matrix a)
{
    //ваши вычисления
    return a;
}
woohoo
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
30.06.2010, 17:56     Матрица.. #9
а степени это перемножение матрицы на саму себя? то есть можно сделать рекурсивную процедуру, в нее передается:
  • pS - указатель на ту матрицу, к которой суммируем
  • pM - указатель на ту матрицу, которую нужно домножить на A
  • pA - указатель на саму A
  • k - текущая степень
она за одну итерацию
  • умножает pM на pA и прибавляет к pS
  • потом запускает еще одну себя (если k<n), передавая ей
    - pS(там уже накопилась некоторая сумма)
    - pM (уже домноженная на A, то есть теперь это A^k)
    - pA (эта неизменна)
    - k+1
в итоге в pS накопится ответ

ну, на вскидку так

Добавлено через 3 минуты
подразумевается что вы понимаете что за указатели такие на матрицу
то есть и возвращать ничего не нужно по сути, рекурсивно вычисляется A^k (то есть циклом-то проще это реализовать на самом на деле)
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
30.06.2010, 18:39  [ТС]     Матрица.. #10
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
class cmatrx
{
public:
        cmatrx(){};
        cmatrx(int f[m][m]) {matr=f;}
        int matr[m][m];
};
 
{
 
cmatrx func(int array[m][m], int A[m][m], int e[m][m],int n, int *N)
    {
    if (n=N) return 1;
    B[m][m]=m_matr(array[m][m],A[m][m]);
 
    return array[m][m]+func(B[m][m], A[m][m], e[m][m], n+1, &N)
 
    }
 
 
 
}
 
 
cmatrx m_matr(A[m][m], B[m][m])
{
int i, j;
for(i=0;i<N;i++)   
    {
     for(j=0;j<N;j++) 
        {
                B(i,j)=0;
                for(k=0;k<N;k++)
            {
                     C(i,j)+=A(i,k)*B(k,j);
                }
            }
    }
}
Добавлено через 22 секунды
Будет ли это работать?
Aaxenon
30.06.2010, 18:45
  #11

Не по теме:

скомпильте и посмотрите о.о

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.06.2010, 18:46     Матрица.. #12
Цитата Сообщение от Я вас люблю Посмотреть сообщение
Будет ли это работать?
Скорее всего даже не скомпилируется. Вы сути не поняли - класс нужен, чтобы внутри него двухмерный массив спрятать, а Вы пытаетесь эти самые массивы параметрами в функции класса передавать.
woohoo
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
30.06.2010, 18:50     Матрица.. #13
Я вас люблю - явно нет. если понял что я там написал, попробуй для начала это сделать с обычными массивами и в цикле, как заработает, попробуй переделать в простенькую рекурсию
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
01.07.2010, 10:24     Матрица.. #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
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/////////////////////////////////////////////////////////////////////////////
// Дана матрица А порядка m, и натуральное число n, надо вычислить 
// E + A + A^2 + ..... + A^n с помощью рекурсии.
/////////////////////////////////////////////////////////////////////////////
#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>
#include <iomanip>
/////////////////////////////////////////////////////////////////////////////
class T_kvadr_matrix
{
    typedef double               T_elem;
    typedef std::vector<T_elem>  T_row;
    typedef std::vector<T_row>   T_tabl;
    //-----------------------------------------------------------------------    
    T_tabl                       tabl_;
    //-----------------------------------------------------------------------    
public:
    //-----------------------------------------------------------------------    
    T_kvadr_matrix(int dim) : tabl_(dim, T_row(dim))
    {}
    //-----------------------------------------------------------------------    
    void input()
    {
        std::cout << "Введите матрицу порядка "   
                  << dim()
                  << ":"
                  << std::endl;
 
        for(size_t i = 0; i < dim(); ++i)
        {
            for(size_t j = 0; j < dim(); ++j)
            {
                std::cout << "A("
                          << i
                          << ", "
                          << j
                          << ") = ";                
                std::cin >> (*this)(i, j);
            }
            std::cout << std::endl;
        }
    }
    //-----------------------------------------------------------------------
    T_kvadr_matrix  operator+ (const T_kvadr_matrix&  M) const
    {
        if(dim() != M.dim())
        {
            std::cout << "Не совпадают размерности складываемых матриц."
                      << std::endl;
            exit(EXIT_FAILURE);
        }
        T_kvadr_matrix  res_matr(dim());
 
        for(size_t  i = 0; i < dim(); ++i)
        {
            std::transform(get_row(i).begin(), get_row(i).end(),
                           M.get_row(i).begin(),
                           res_matr.get_row(i).begin(), std::plus<T_elem>());
        }
 
        return  res_matr;
    }    
    //-----------------------------------------------------------------------
    T_kvadr_matrix  operator* (const T_kvadr_matrix&  M) const
    {
        if(dim() != M.dim())
        {
            std::cout << "Не совпадают размерности перемножаемых матриц."
                      << std::endl;
            exit(EXIT_FAILURE);
        }
        T_kvadr_matrix  res_matr(dim());
        T_kvadr_matrix  M_transp(M.get_transp());
        for(size_t  i = 0; i < dim(); ++i)
        {            
            for(size_t  j = 0; j < dim(); ++j)
            {        
                res_matr(i, j)
                    = std::inner_product(get_row(i).begin(), get_row(i).end(),
                                         M_transp.get_row(j).begin(), T_elem());
 
            }            
        }
        return  res_matr;
    }
    //-----------------------------------------------------------------------
    T_kvadr_matrix  E()
    {
        T_kvadr_matrix  res_matr(dim());
        for(size_t i = 0; i < res_matr.dim(); ++i)
        {            
            res_matr(i, i) = 1;
        }
        return  res_matr;
    }
    //-----------------------------------------------------------------------
    void  print() const
    {
        for(size_t i = 0; i < dim(); ++i)
        {
            for(size_t j = 0; j < dim(); ++j)
            {
                std::cout << std::setprecision(4)
                          << std::setw(12)                          
                          << (*this)(i, j);                          
            }            
            std::cout << std::endl;
            std::cout << std::endl;
        }            
    }
    //-----------------------------------------------------------------------
    T_kvadr_matrix  get_transp() const
    {
        T_kvadr_matrix  res_transp(dim());
        for(size_t  i = 0; i < dim(); ++i)
        {
            for(size_t  j = 0; j < dim(); ++j)
            {                
                res_transp(i, j) = (*this)(j, i);
            }            
        }
        return  res_transp;
    }
    //-----------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------
    size_t dim() const
    {
        return tabl_.size();
    }
    //-----------------------------------------------------------------------
    T_elem  operator () (size_t i, size_t j) const
    {
        return tabl_[i][j];
    }
    //-----------------------------------------------------------------------
    T_elem&  operator () (size_t i, size_t j)
    {
        return tabl_[i][j];
    }
    //-----------------------------------------------------------------------
    const T_row&  get_row(int i) const
    {
        return tabl_[i];
    }
    //-----------------------------------------------------------------------
    T_row&  get_row(int i) 
    {
        return tabl_[i];
    }
    //-----------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////
std::ostream& operator<<(std::ostream& os, const T_kvadr_matrix& M)
{
    M.print();
    return os;
}
/////////////////////////////////////////////////////////////////////////////
std::istream& operator>>(std::istream& is, T_kvadr_matrix& M)
{
    M.input();
    return is;
}
/////////////////////////////////////////////////////////////////////////////
T_kvadr_matrix  matr_polinom(T_kvadr_matrix A, int stepen)
{
    return stepen == 0 ? A.E() : A.E() + A * matr_polinom(A, stepen - 1);
}
/////////////////////////////////////////////////////////////////////////////
 
int main()
{
    std::locale::global(std::locale(""));   
    int m;
    do
    {
        std::cout << "Введите размерность марицы: m = ";
        std::cin >> m;
    }while(m <= 0);
    
    T_kvadr_matrix  A(m);
    std::cin >> A;    
    std::cout << "Введенная матрица A:"
              << std::endl
              << A;    
    int n;
    do
    {
        std::cout << "Введите степень матричного полинома: n = ";
        std::cin >> n;
    }while(n < 0);
 
    if(n == 0)
    {
        std::cout << "Значение матричного полинома A^0 равно:";   
    }
    else if(n == 1)
    {
        std::cout << "Значение матричного полинома A^0 + A^1 равно:";   
    }
    else
    {
        std::cout << "Значение матричного полинома A^0 + A^1 + ... + A^"
                  << n
                  << " равно:";    
    }    
    std::cout << std::endl
              << matr_polinom(A, n);             
    return 0;
}
woohoo
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
01.07.2010, 10:51     Матрица.. #15
Mr.X, пожалуй ему этого класса еще на десяток заданий про матрицы хватит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2010, 11:11     Матрица..
Еще ссылки по теме:

Дана матрица целых чисел, из n строк и n столбцов (n < = 100).Определить является ли матрица нулевой (состоит из одних нулей) C++
C++ дана квадратичная матрица z[n][n]. составить программу, которая если матрица симметричная(транспонированная матрица равна исходной), сделает ее не сим

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

Или воспользуйтесь поиском по форуму:
Усков Борис
2 / 2 / 0
Регистрация: 27.06.2010
Сообщений: 27
01.07.2010, 11:11     Матрица.. #16
Передавайте все по ссылке, константный указатель здесь не нужен это только если в функцию значения передаете, а Вам ее вернуть надо
Yandex
Объявления
01.07.2010, 11:11     Матрица..
Ответ Создать тему
Опции темы

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