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

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

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

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

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

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

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

Дана квадратная матрица А порядка n. Проверьте, является ли матрица единичной - Delphi
Дана квадратная матрица А порядка n. Проверьте, является ли матрица единичной. Описать с помощью функций и процедур. Ввод-вывод в текстовый...

Дана квадратная матрица А порядка n. Проверить, является ли матрица единичной. - Turbo Pascal
Ребят,помогите решить задачу "Дана квадратная матрица А порядка n. Проверить, является ли матрица единичной"

Как доказать то, что матрица и транспонированная ей матрица имеют одинаковые собственные числа? - Алгебра
Как доказать то, что матрица и транспонированная ей матрица имеют одинаковые собственные числа с одинаковой кратностью? Добавлено...

Матрица:Даны натуральное число n, действительная матрица размера n х 9. Найти среднее арифметическое: каждого - QBasic
Даны натуральное число n, действительная матрица размера n х 9. Найти среднее арифметическое: каждого из столбцов.

Непонятки с DirectX (матрица поворота, камера, матрица проекции) - DirectX
Возник вопрос по DirectX, точнее по матрицам Вопрос 1: D3DXMATRIXA16 matWorld; UINT iTime = timeGetTime() % 10000; ...

Матрица:Даны натуральное число n, действительная матрица размера n х 9. Найти среднее арифметическое: каждого из столбцов - Free Pascal
Даны натуральное число n, действительная матрица размера n х 9. Найти среднее арифметическое: каждого из столбцов.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Усков Борис
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
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
30.06.2010, 17:08     Матрица.. #4
Цитата Сообщение от Я вас люблю Посмотреть сообщение
а насколько я знаю так делать нельзя (или даже невозможно).
таки да... Вот поэтому в рекурсивную функцию передавайте указатель/ссылку на матрицу.
requester
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 40
30.06.2010, 17:16     Матрица.. #5
У меня та же проблема. Чтобы применить рекурсию к матрице надо чтобы она явно возвращала матрицу (в return), а не просто перезаписывала ее в процессе выполнения.
IchMors
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
30.06.2010, 17:22     Матрица.. #6
попробуйте создать простенький класс содержащий матрицу. Объект вернуть можно уж точно
Я вас люблю
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 4
30.06.2010, 17:26  [ТС]     Матрица.. #7
Приведите хотя б простейший пример, применительно к этой задаче..я просто не знаю, как это(
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;
}
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
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,502
30.06.2010, 18:46     Матрица.. #12
Цитата Сообщение от Я вас люблю Посмотреть сообщение
Будет ли это работать?
Скорее всего даже не скомпилируется. Вы сути не поняли - класс нужен, чтобы внутри него двухмерный массив спрятать, а Вы пытаетесь эти самые массивы параметрами в функции класса передавать.
woohoo
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
30.06.2010, 18:50     Матрица.. #13
Я вас люблю - явно нет. если понял что я там написал, попробуй для начала это сделать с обычными массивами и в цикле, как заработает, попробуй переделать в простенькую рекурсию
Mr.X
Эксперт С++
3048 / 1693 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2010, 10:51     Матрица..
Еще ссылки по теме:

Дана матрица целых чисел, из 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; ...

Матрица В-транспонированная матрица А. Вывести матрицу В - Visual Basic
Дана матрица целых чисел А, состоящая из М строк и N столбцов Матрица В-транспонированная матрица А. Вывести матрицу В

Доказать, что матрица P идемпотентна. Показать, что матрица I = 2P - E инволютивна - Matlab
Очень нужна помощь первый раз использую matlab

Доказать, что матрица P идемпотентна. Показать, что матрица I = 2P - E инволютивна - MathCAD
Матрица P называется идемпотентной, если P2 = P. Матрица I называется инволютивной, если I2 = E.


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

Или воспользуйтесь поиском по форуму:
woohoo
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
01.07.2010, 10:51     Матрица.. #15
Mr.X, пожалуй ему этого класса еще на десяток заданий про матрицы хватит
Yandex
Объявления
01.07.2010, 10:51     Матрица..
Ответ Создать тему
Опции темы

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