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

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

Войти
Регистрация
Восстановить пароль
 
 
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
#1

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

30.06.2010, 16:33. Просмотров 765. Ответов 15
Метки нет (Все метки)

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

дана квадратичная матрица z[n][n]. составить программу, которая если матрица симметричная(транспонированная матрица равна исходной), сделает ее не сим - C++
помогите пожалуйста. условие: дана квадратичная матрица z. составить программу, которая если матрица симметричная(транспонированная...

Дана матрица целых чисел, из n строк и n столбцов (n < = 100).Определить является ли матрица нулевой (состоит из одних нулей) - C++
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include&lt;conio.h&gt; void main() { int mas; int N; int max_element; int...

Дана матрица целых чисел, из n строк и n столбцов (n < = 100).Определить является ли матрица нулевой (состоит из одних нулей) - C++
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include &lt;stdlib.h&gt; int main(int argc, char* argv) { srand(time(NULL)); int mas; ...

Даны квадратная матрица A порядка n и вектор с n элементами. Получить вектор: (A=E)b, где E единичная матрица порядка n - C++
Даны квадратная матрица A порядка n и вектор с n элементами. Получить вектор: (A=E)b, где E-единичная матрица порядка n. Помогите...

Определить базовый класс "Матрица" и класс-потомок "Треугольная матрица" - C++
Нужно определить класс &quot;матрица&quot; с возможностью динамического выделения и освобождения памяти, наполнения матрицы, сохранения и чтения из...

матрица - C++
дан двумерный массив чисел (любой) необходимо распределитьв этой матрице нечётные числа по возрастанию,а чётные по убыванию

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Усков Борис
2 / 2 / 0
Регистрация: 27.06.2010
Сообщений: 27
30.06.2010, 16:52 #2
У Вас вероятно переполняется стек (рекурсивные подпрограммы вообще очень быстро заполняют стек своими адресами возврата). Вероятно необходимо передать матрицу не по значению, а по ссылке тогда в стек будет помещена не сама матрица, а ее адрес в оперативной памяти.
Примечание: в данном случае будет изменен массив в памяти, а не будет возвращена его измененная локальная копия в стеке.
В паскале и C++ возможна также передача константного указателя когда в подпрограмму передается адрес переменной, но ее значение нельзя изменить в подпрограмме
Если что спрашивайте
0
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
30.06.2010, 16:59  [ТС] #3
Задача такая: Дана матрица А порядка m, и натуральное число n, надо вычислить E+A+A^2+.....+A^n с помощью рекурсии.
У меня получается, что рекурсивная функция должна возвращать матрицу, а насколько я знаю так делать нельзя (или даже невозможно).
0
IchMors
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
30.06.2010, 17:08 #4
Цитата Сообщение от Я вас люблю Посмотреть сообщение
а насколько я знаю так делать нельзя (или даже невозможно).
таки да... Вот поэтому в рекурсивную функцию передавайте указатель/ссылку на матрицу.
0
requester
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 40
30.06.2010, 17:16 #5
У меня та же проблема. Чтобы применить рекурсию к матрице надо чтобы она явно возвращала матрицу (в return), а не просто перезаписывала ее в процессе выполнения.
0
IchMors
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
30.06.2010, 17:22 #6
попробуйте создать простенький класс содержащий матрицу. Объект вернуть можно уж точно
1
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
30.06.2010, 17:26  [ТС] #7
Приведите хотя б простейший пример, применительно к этой задаче..я просто не знаю, как это(
0
IchMors
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
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;
}
2
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 (то есть циклом-то проще это реализовать на самом на деле)
2
Я вас люблю
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 секунды
Будет ли это работать?
0
Aaxenon
30.06.2010, 18:45
  #11

Не по теме:

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

0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
30.06.2010, 18:46 #12
Цитата Сообщение от Я вас люблю Посмотреть сообщение
Будет ли это работать?
Скорее всего даже не скомпилируется. Вы сути не поняли - класс нужен, чтобы внутри него двухмерный массив спрятать, а Вы пытаетесь эти самые массивы параметрами в функции класса передавать.
0
woohoo
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
30.06.2010, 18:50 #13
Я вас люблю - явно нет. если понял что я там написал, попробуй для начала это сделать с обычными массивами и в цикле, как заработает, попробуй переделать в простенькую рекурсию
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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;
}
0
woohoo
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
01.07.2010, 10:51 #15
Mr.X, пожалуй ему этого класса еще на десяток заданий про матрицы хватит
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2010, 10:51
Привет! Вот еще темы с ответами:

матрица - C++
помогите решить,пожалуйста... _________________________ дана действительная квадратная матрица С(n,n). найти максимальный элемент в...

Матрица - C++
Здравствуйте. Прошу помочь. Дана целочисленная квадратная матрица. Определить: • сумму элементов в тех столбцах, которые не...

матрица с++ - C++
помогите пожалуйста!!!! 1.Составить программу для подсчета среднего арифмитического элемента,расположенных на главной и побочной...

Матрица - C++
короче вот такая хрень)) Дана целочисленная квадратная матрица. Определить: 1). произведение элементов в тех строках, которые не...


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

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

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