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

Двухмерный динамический массив - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Электронные часы, проверка ввода http://www.cyberforum.ru/cpp-beginners/thread692886.html
есть рабочий код, помогите модернизировать, время вводится пользователем, выход на российский формат и европейский формат. Нужно чтоб еще проверку делал если ввод неверный и выдавал сообщение с просьбой нового ввода. если допустим введем 70:67:00 #include <stdafx.h> #include <iostream> #include <conio.h> using namespace std; struct time { int h; int m; int s;}; void rustime (const time...
C++ Библиотека для удобной работы с типом string с++ Привет, надо проводить много манипуляций со строками - обрезка, перенос строки, выравнивание - для интерфейса 3D-игры. Есть ли готовая библиотека для таких операций? Для ОС Windows. http://www.cyberforum.ru/cpp-beginners/thread692869.html
C++ Обработка двумерных массивов (Вычислить матрицу D, равную произведению элементов матрицы М на константу.)
Дана матрица М (4 5) и константа С. Вычислить матрицу D, равную произведению элементов матрицы М на константу. Помогите плиз))
C++ Почему программа не хочет повторять новый ввод?
Первый раз считает отлично. Прошу повторить - пишет везде 0 и не спрашивает о вводе нового string? #include <iostream> #include <string> #define MAXNUM 1000 using namespace std;
C++ Составить программу, которая печатает true, если точка с координатами (x,y) принадлежит закрашенной области, и false в противном случае: http://www.cyberforum.ru/cpp-beginners/thread692814.html
Составить программу, которая печатает true, если точка с координатами (x,y) принадлежит закрашенной области, и false в противном случае: #include <conio.h> #include <iostream.h> #include <math.h> void main() { int x, y,o;
C++ Найти минимальное значение главной диагонали и максимальное значение вспомогательной диагонали в матрице ! Найти минимальное значение главной диагонали и максимальное значение вспомогательной диагонали в матрице порядка n. Найденные значения поменять местами. Если эти значения принадлежат одному элементу, то это значение присвоить всем элементам главной и вспомогательной диагоналям. помогите решить подробнее

Показать сообщение отдельно
АлексИванов
0 / 0 / 1
Регистрация: 08.11.2012
Сообщений: 72
09.11.2012, 17:50  [ТС]     Двухмерный динамический массив
Цитата Сообщение от prZzZ Посмотреть сообщение
АлексИванов, здравствуйте. В Вашем случае тупо не хватает ни оперативной ни виртуальной памяти. Как написал Croessmah в #29 это порядка 728 Tb. Ответ на вопрос какую такую задачу вы решаете мы также не получили...
Как вариант можно предложить только использование разреженных массивов.
В новом посте двухмерный массив #3 описал условие задачи.

Добавлено через 50 секунд
Kuzia domovenok, В новом посте двухмерный массив #3 описал условие задачи.

Добавлено через 13 минут
Вообще у меня стоит задача такая:
Есть 3 уравнения, полученных по средством численного метода Эйлера, стохастические, дифференциальные с мультипликативным шумом,их нужно промоделировать, и построить разные графики такие как : оценку матожидания, оценку дисперсии, гистограмму плотности распределения случайной величины, двухмерную гистограмму, тоесть поверхность, и двухмерный фазовый портрет. Всё выше перечисленное относиться к области теории вероятности, методам Монте-Карло, и вычислительной математике.
3 уравнения записаны в явном виде, и для их реализации нужно смоделировать M=1000(чеб больше траекторий тем точнее решается задача) штук траекторий для каждого уравнения, где 1 траектория моделируется как правило на сетке от T=[0,100] с шагом h=0,0001(чем меньше шаг,тем более точно получается расчет).
Оценку матожидания, оценку дисперсии, гистограмму плотности распределения случайной величины я строить умею, и для реализации использовал одномерные массивы, но когда речь пошла о реализации двухмерного фазового портрета то тут я решил использовать двухмерные массивы.
Что такое двумерная плотность: Берется срез в произвольном узле например при T=70 и на каждой из 1000 траекторий запоминаются значения, например y1, аналогично запоминается значения переменной y2, и того получилось 1000 значений y1 и 1000 значений y2. Построение 2мерной плотности происходит следующим образом, ищется максимальное и минимальное значение y1 и y2, задается разбиение сетки например hag=100. рисуется сетка 100 на 100 с шагом (max-min)/hag. Далее берется первая траектория и соответствующая точка на ней (y1,y2) и смотрим в какой квадрат нашей сетки она попала, и двумерному массиву размер которого 100 на 100 соответствующим координатам присваиваем 1 count[i][j]=count[i][j]+1. В итоге в этом двумерном массиве хранятся количество попаданий точек (y1,y2) в соответствующий квадрат сетки, и получается 3х емрная поверхность.
Что такое двухмерный фазовый портрет: вот тут как раз нужно проделать примерно то же что и выше, разница только в том что выше учитывалась 1 точка на 1 траектории 1го уравнения, а здесь нужно запомнить все точки на 1 траектории, то есть после построения 1 траектории пар (y1,y2) будет 1000000, которые я как раз решил сохранять в двумерный массив, то есть для компоненты y1 один двумерный массив размер которого 1000000x1000, и аналогично для компоненты y2. далее так же идет перебор, нахождения min и max, задается количество разбиения и строиться 2мерный массив с количеством попаданий соответствующих пар (y1,y2) в построенную сетку.И получается трехмерная картинка.
Так как я не опытный программист, первое что пришло в голову всё это реализовывать с помощью двухмерного массива.О других способах ещё не думал, как обойтись без них.
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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
h=0.001;
 T=100;
 N= int(T/h);
 M=100;
 sigma=3;
 nach_y1=1;
 nach_y2=1;
 nach_y3=20;
 r=19;
 pi= 2*asin(1.0);
 hag=100;  //колличество интервалов разбиения для построения гистограммы
 hag1=50; //колличество интервалов разбиения для построения двухмерной гистограммы
           /*-----------------------------------------*/
 
 
 y1 =(double*)malloc(N*sizeof(double)); //Массив для расчета нужных функционалов
 y2 =(double*)malloc(N*sizeof(double)); //
 y3=(double*)malloc(N*sizeof(double));  //
 summ =(double*)malloc(N*sizeof(double));//Массив для вторых моментов
 x_x = (double*)malloc(N*sizeof(double));//Массив для расчета матожидания
 disper = (double*)malloc(N*sizeof(double));//Массив для расчета дисперсии
 gistogr = (double*)malloc(M*sizeof(double));// Массив для расчета гистограммы
 gistogr2 = (double*)malloc(M*sizeof(double));//Вспомогательный массив для расчета двумерной гистограммы
 gistogr2_1 = (double*)malloc(M*sizeof(double));//Вспомогательный массив для расчета двумерной гистограммы
 
 
   yy1 = new double*[N]; //Вспомогательный 2-мерный Массив N*M данных для расчета 2-мерного фазового портрета
    for(int k= 0; k < N; k++)
        yy1[k] = new double [M];
 
    yy3 = new double*[N];//
    for(int k= 0; k < N; k++)
        yy3[k] = new double [M];
 
    for (int i = 0; i < N; i++) //Обнуление массивов
        for (int k = 0; k <M ; k++)
        {
         yy1[i][k]=0;
         yy3[i][k]=0;
        }
 
    for (int i = 0; i < N; i++)//Обнуление массивов
         {
                y1[i]=0;
                y2[i]=0;
                y3[i]=0;
                summ[i]=0;
                x_x[i]=0;
         }
 
 
   for (int i = 0; i < M; i++)
   {
      gistogr[i]=0;
      gistogr2[i]=0;
      gistogr2_1[i]=0;
    }
 
     for (int k = 0; k < M; k++)//ВВод начальных условий в 2-мерные массивы
        {
         yy1[0][k]=nach_y1;
         yy3[0][k]=nach_y3;
        }
 
 
 for(int j = 1; j <= M; j++)//цыкл для моделирования M штук траекторий
          {
       y1[0] = nach_y1;
       y2[0] = nach_y2;
       y3[0] = nach_y3;
       x_x[0] = x_x[0]+y1[0]/M;
       summ[0]=summ[0]+(double)(y1[0]*y1[0])/M;
 
    for(int i=0; i<N; i++)//цыкл для моделирования 1 траектории
         {
 
     alfa1 = (double)rand()/(double)RAND_MAX;
        while(alfa1 == 0)
            alfa1 = (double)rand()/(double)RAND_MAX;
     alfa2 = (double)rand()/(double)RAND_MAX;
     ksi = sqrt(-2*log(alfa1))*sin(2*pi*alfa2);//моделирование гаусовской случайной величины
 
    y1[i+1] = y1[i]-h*10*(y1[i]-y2[i]);
    y2[i+1] = y2[i]+h*(-y2[i]-y1[i]*y3[i]+r*y1[i])+sigma*y1[i]*(sqrt(h))*ksi;
    y3[i+1] = y3[i]+h*(-(8/3)*y3[i]+y1[i]*y2[i]);
 
    x_x[i+1]=x_x[i+1]+y1[i+1]/M; //Расчитывается оценка математического ожидания
    summ[i+1]=summ[i+1]+(double)(y1[i+1]*y1[i+1])/M;//Расчитывается второй момент
 
     yy1[i][j]=y1[i+1]; //Заполнение вспомогательных массивов для построения 2-мерного фазового портрета
     yy3[i][j]=y3[i+1]; //
 
   }
     gistogr2[j-1]=y1[N-1];
     gistogr2_1[j-1]=y3[N-1];
   }
 
  /*---------------Начало построения дмумерной плотности---------------*/
     MIN=gistogr2[0];
   MAX=MIN;
   MIN1=gistogr2_1[0];
   MAX1=MIN1;
   for (int i=1; i <M; i++)
    {
        if (gistogr2[i]<MIN)
        {
             MIN=gistogr2[i];
        }
 
        if (gistogr2[i]>MAX)
        {
            MAX=gistogr2[i];
        }
 
        if (gistogr2_1[i]<MIN1)
        {
             MIN1=gistogr2_1[i];
        }
 
        if (gistogr2_1[i]>MAX1)
        {
            MAX1=gistogr2_1[i];
        }
    }
 
      a=MIN;
      b=MAX;
      a1=MIN1;
      b1=MAX1;
 
   double **count1;
 
    count1 = new double*[hag1];
    for(int k= 0; k < hag1; k++)
        count1[k] = new double [hag1];
 
      for (int i = 0; i < hag1; i++)
        for (int k = 0; k < hag1; k++)
        {
         count1[i][k]=0;
        }
 
      double const1,const2;
      const1=double((b-a)/hag1);
      const2=double((b1-a1)/hag1);
 
    double *setka2_0, *setka2_1;
    setka2_0=(double*)malloc(hag*sizeof(double));
    setka2_1=(double*)malloc(hag*sizeof(double));
    setka2_0[0]=a;
    setka2_1[0]=a1;
 
    for (int j = 0; j < hag1; j++)
    {
        setka2_0[j+1]=setka2_0[j]+const1;
        setka2_1[j+1]=setka2_1[j]+const2;
    }
 
     int X,Y;
     X=hag1;
     Y=hag1;
 
  for (int j=0; j < M; j++)
  {
   for (int i=0; i < X; i++)
     {
     if ((setka2_0[i]<=gistogr2[j]) && (gistogr2[j]<=setka2_0[i+1]))
         X=i;
     }
   for (int k=0; k < Y; k++)
     {
     if  ((setka2_1[k]<=gistogr2_1[j]) && (gistogr2_1[j]<=setka2_1[k+1]))
         Y=k;
     }
 
      count1[X][Y]= count1[X][Y]+1;
      X=hag1;
      Y=hag1;
 
   }
 
     FILE * SETKA2_0;
     FILE * SETKA2_1;
     SETKA2_0 = fopen("Сетка_для_построения_двухмерной_гистограммы_ось_абсцисс.txt","wt");
     SETKA2_1 = fopen("Сетка_для_построения_двухмерной_гистограммы_ось_ординат.txt","wt");
        for (int j = 0; j < hag1; j++)
        {
          fprintf( SETKA2_0, "%f " , setka2_0[j] );
          fprintf( SETKA2_1, "%f " , setka2_1[j] );
        }
     fclose(SETKA2_0);
     fclose(SETKA2_1);
 
 
 
    int peremennaya1;
    peremennaya1=0;
 
     FILE * MATRICA;
     MATRICA = fopen("Матрица_для_построения_двумерной_плотности.txt","wt");
 
 
     for (int i = 0; i < hag1; i++)
       {
        for (int k = 0; k < hag1; k++)
        {
          peremennaya1= count1[i][k];
          fprintf( MATRICA, "%d " , peremennaya1 );
        }
          fprintf( MATRICA, "\n");
       }
  fclose(MATRICA);
 
 /*----------Начало построения 2хмерного фазового портрета----------*/
 
   double *setka3_0, *setka3_1;
 double C,D,C1,D1;
 int hag2;
 double minn,maxx,minn1,maxx1;
   minn=yy1[0][0];
   maxx=minn;
   minn1=yy3[0][0];
   maxx1=minn1;
  for (int k = 1; k < M; k++)
  {
   for (int i=1; i <N; i++)
    {
        if (yy1[i][k]<minn)
        {
             minn=yy1[i][k];
        }
 
        if (yy1[i][k]>maxx)
        {
            maxx=yy1[i][k];
        }
 
        if (yy3[i][k]<minn1)
        {
             minn1=yy3[i][k];
        }
 
        if (yy3[i][k]>maxx1)
        {
            maxx1=yy3[i][k];
        }
    }
    }
 
  C=minn;
  D=maxx;
  C1=minn1;
  D1=maxx1;
 
 
   FILE * portret;
    portret = fopen ("FAZOVYI_Portret_MinMax.txt","wt");
    fprintf( portret, "%f " , C );
    fprintf( portret, "%f " , D );
  fclose(portret);
 
   FILE * portret1;
  portret1 = fopen("FAZOVYI_portet_Min1,Max1.txt","wt");
   fprintf( portret1, "%f " , C1);
     fprintf( portret1, "%f " , D1);
  fclose(portret);
 
  hag2=100;
   double **count2;
 
    count2 = new double*[hag2];
    for(int k= 0; k < hag; k++)
        count2[k] = new double [hag2];
 
      for (int i = 0; i < hag2; i++)
        for (int k = 0; k < hag2; k++)
        {
         count2[i][k]=0;
        }
 
      double const3,const4;
      const3=double((C-D)/hag2);
      const4=double((C1-D1)/hag2);
 
 
 
 
    setka3_0=(double*)malloc(hag2*sizeof(double));
    setka3_1=(double*)malloc(hag2*sizeof(double));
    setka3_0[0]=C;
    setka3_1[0]=C1;
 
    for (int j = 0; j < hag2; j++)
    {
        setka3_0[j+1]=setka3_0[j]+const1;
        setka3_1[j+1]=setka3_1[j]+const2;
 
    }
 
    int X2,Y2;
     X2=hag2;
     Y2=hag2;
 
  for (int o = 0; o < M; o++)
  {
     for (int j=0; j <N; j++)
     {
  for (int i=0; i < X2; i++)
     {
     if ((setka3_0[i]<=yy1[j][o]) && (yy1[j][o]<=setka3_0[i+1]))
         X2=i;
     }
  for (int k=0; k < Y2; k++)
     {
     if  ((setka3_1[k]<=yy3[j][o]) && (yy3[j][o]<=setka3_1[k+1]))
         Y2=k;
 
     }
 
      count2[X][Y]= count2[X][Y]+1;
      X2=hag2;
      Y2=hag2;
 
    }
     }
    int peremennaya2;
     peremennaya2=0;
 
     FILE * MATRICA1;
     MATRICA = fopen("FAZOVYI_PORTRET.txt","wt");
 
 
     for (int i = 0; i < hag2; i++)
       {
        for (int k = 0; k < hag2; k++)
        {
          peremennaya2= count2[i][k];
          fprintf( MATRICA1, "%d " , peremennaya2 );
        }
          fprintf( MATRICA1, "\n");
    }
  fclose(MATRICA1);
 
  for(int k= 0; k < N; k++)
      {
        delete [] yy1[k];
        delete [] yy3[k];
      }
        delete [] yy1;
        delete [] yy3;
  for(int k= 0; k < hag1; k++)
   {
    delete [] count1[k];
   }
    delete [] count1;
 
  for(int k= 0; k < hag2; k++)
   {
    delete [] count2[k];
   }
    delete [] count2;
Вот так выглядела моя программа до обращения на форум. Как же обойтись без использования столь больших массивов я пока не придумал.Опустил часть кода, где описываются переменные, и вычисляется простая однамерная гистограмма, дисперсия и матожидание, так как с этим нет проблем.
 
Текущее время: 06:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru