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

Матрица..

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

Author24 — интернет-сервис помощи студентам
Всем приветя вот столкнулся с какой проблемой.Мне нужно написать в программе, чтобы рекурсия возвращала МАТРИЦУ.Как бы я не пытался это сделать, не получается(помогите, кто может.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2010, 16:33
Ответы с готовыми решениями:

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

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

Нужны преобразования: список смежных вершин -> список инцидентных ребер -> матрица инцидентности -> матрица смежности
Нужны такие преобразования: список смежных вершин -&gt; список инцидентных ребер -&gt; матрица...

Шаблон функции матрица-матрица
не понимаю как сделать шаблон для этого функции. Нужно написать для типа int и float. Операция...

15
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
98 / 94 / 16
Регистрация: 16.05.2010
Сообщений: 310
30.06.2010, 17:08 4
Цитата Сообщение от Я вас люблю Посмотреть сообщение
а насколько я знаю так делать нельзя (или даже невозможно).
таки да... Вот поэтому в рекурсивную функцию передавайте указатель/ссылку на матрицу.
0
0 / 0 / 0
Регистрация: 23.11.2009
Сообщений: 40
30.06.2010, 17:16 5
У меня та же проблема. Чтобы применить рекурсию к матрице надо чтобы она явно возвращала матрицу (в return), а не просто перезаписывала ее в процессе выполнения.
0
98 / 94 / 16
Регистрация: 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
98 / 94 / 16
Регистрация: 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
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
30.06.2010, 18:46 12
Цитата Сообщение от Я вас люблю Посмотреть сообщение
Будет ли это работать?
Скорее всего даже не скомпилируется. Вы сути не поняли - класс нужен, чтобы внутри него двухмерный массив спрятать, а Вы пытаетесь эти самые массивы параметрами в функции класса передавать.
0
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
30.06.2010, 18:50 13
Я вас люблю - явно нет. если понял что я там написал, попробуй для начала это сделать с обычными массивами и в цикле, как заработает, попробуй переделать в простенькую рекурсию
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 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
7 / 7 / 1
Регистрация: 30.06.2010
Сообщений: 27
01.07.2010, 10:51 15
Mr.X, пожалуй ему этого класса еще на десяток заданий про матрицы хватит
0
2 / 2 / 0
Регистрация: 27.06.2010
Сообщений: 27
01.07.2010, 11:11 16
Передавайте все по ссылке, константный указатель здесь не нужен это только если в функцию значения передаете, а Вам ее вернуть надо
0
01.07.2010, 11:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2010, 11:11
Помогаю со студенческими работами здесь

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

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

матрица А+В
помогите пожалуйста составить программу. Условие: Даны квадратные матрицы А,В порядка n....

матрица
Дана матрица размера M × N. Найти максимальный среди минимальных элементов ее строк.


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

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