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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.83
paul
0 / 0 / 0
Регистрация: 16.03.2008
Сообщений: 18
#1

Построить результат сглаживания заданной вещественной матрицы - C++

01.10.2008, 21:35. Просмотров 4809. Ответов 13
Метки нет (Все метки)

Соседями элемента Aij в матрице назовем элементы Akl с i-1 ≤ k ≤ i+1, j-1 ≤ l ≤ j+1, (k, l) ≠ (i, j). Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент которой получается как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы. Построить результат сглаживания заданной вещественной матрицы размером 10 на 10.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2008, 21:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Построить результат сглаживания заданной вещественной матрицы (C++):

Построить результат сглаживания заданной вещественной матрицы размером 10 на 10 - C++
:cry: Помогите пожалуйста, написать программу в с++. А то я чайник, ничего не понимаю... Соседями элемента А с индексом ij в матрице...

Построить результат сглаживания заданной вещественной матрицы размером 10 на 10. - C++
Соседями элемента Аij в матрице назовем элементы Аk! С i-1≤k≤i+1,j-1≤1≤j+1, (k, 1) ≠ (I, j). Операция сглаживания матрицы дает новую...

Произвести сортировку столбцов заданной вещественной матрицы по убыванию элементов последней строки - C++
Дан двумерный массив вещественных чисел размерностью . Произвести сортировку столбцов по убыванию элементов последней строки....

По заданной вещественной матрице N*M найти - C++
По заданной вещественной матрице N*M найти Мои наработки: #include <stdio.h> #include <conio.h> #define N 5 ...

класс вещественной матрицы - C++
Доброго времени, не могу написать программу, не знаю с++ Составить алгоритм и программу а которой не обходимо описать класс ...

Считывание вещественной матрицы из файла - C++
Я нашел такую прогу, которая считывает из текстового файла матрицу. Проблема в том, что первый раз оно выводит элементы так, как есть. То...

13
qwone
9 / 9 / 1
Регистрация: 18.08.2008
Сообщений: 129
01.10.2008, 21:59 #2
ну и чего тут сложного .
1)создаешь новую матрицу
2)делаешь два цикла и переносишь с вычислением результат. по краям соседей нет поэтому их не учитываешь
3) заменяешь старую на новую
примечание : не пытайся обходиться дез новой . будет глюк ,прога сложнее будет,скорость меньше ,толку еще меньше.
0
paul
0 / 0 / 0
Регистрация: 16.03.2008
Сообщений: 18
01.10.2008, 23:25  [ТС] #3
Я почти сделал, но у меня оно плюсует к соседям элемента сам элемент и в результате элементы новой матрицы выходят как среднее арифметическое исходного элемента плюс соседи этого элемента. Помогите исправить так чтоб оно не плюсовало исходный элемент. Вот код:
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
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
clrscr();
float a[10][10];
float b[10][10];
int i,j,k,l;
randomize();
for(i=0;i<10;i++)
{
    for(j=0;j<10;j++)
    {
a[i][j]=random(10);
cout<<a[i][j]<<" ";
    }
cout<<"\n";
}
for(i=0;i<10;i++)
{
 for(j=0;j<10;j++)
 {
  b[i][j]=0;
  int n=0;
  for(k=i-1;k<i+2;k++)
  {
   if (k<0 || k>=10)
    continue;
   for(l=j-1;l<j+2;l++)
   {
    if((l<0 || l>=10) ||(k!=i && l!=j))
     continue;
    b[i][j]+=a[k][l];
    n++;
   }
  }
  b[i][j]/=n;
 }
}
cout<<endl;
for(i=0;i<10;i++)
{
    for(j=0;j<10;j++)
    {
cout<<b[i][j]<<" ";
    }
cout<<endl;
}
float s=0;
for (i=0; i<10; i++)
for (int j=0; j<i; s+=b[i][j++]);
 cout<<"\ns="<<s;
 getch();
 }
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
01.10.2008, 23:53 #4
paul, Код оформлен ужасно,ни комментариев,ни функций,ни констант. Разбираться в четырех вложенных циклах не хочется,да и код ты,видимо,не сам писал,раз не можешь догадаться,что можно очень прямолинейно перед делением на n вычесть этот элемент.а можно вот в это
Код
(l<0||l>=10)||(k!=i && l!=j )
условие,которое,кстати,записано неправильно, добавить еще одно
Код
  || ( (k==i)&&(l==j) )
1
paul
0 / 0 / 0
Регистрация: 16.03.2008
Сообщений: 18
02.10.2008, 00:20  [ТС] #5
С
Код
|| ( (k==i)&&(l==j) )
ничего не получается, и с этим условием оно так считает что я не пойму каким образом создается новый элемент.
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
02.10.2008, 00:27 #6
paul, я примерно могу сказать,каким образом он создается. Но ошибка в твоем коде,не в моем. Я даже указал где,и еще подскажу,что операции != и && имеют одинаковый приоритет
1
paul
0 / 0 / 0
Регистрация: 16.03.2008
Сообщений: 18
02.10.2008, 00:45  [ТС] #7
Сделал вот так:
Код
if((l<0 || l>=10) || ((k==i && l==j) || (k!=i && l!=j)))
Все норм работает.
0
qwone
9 / 9 / 1
Регистрация: 18.08.2008
Сообщений: 129
02.10.2008, 01:27 #8
да код накрутил будь здоров .там проще могло быть.
0
Юся
26.12.2008, 16:54 #9
я эту же задачу пыталась решать по-другому, но не получается. подскажите пожалуйста, где ошибка (задача с использованием шаблона для класса)
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
#include <cstdlib>
#include <windows.h>
#include <iomanip>
#include <cstddef>
#include <iostream>
using namespace std;
//Шаблон для класса
template <class TT>
class array2
{TT** a;
 int n;
 int m;
 public:
 //конструктор
 array2(int nn,int nm);
 //конструктор по умолчанию
 array2();
 //конструктор копий
 array2(const array2& ob);
 //деструктор
 ~array2();
 //методы доступа
 int getn();
 int getm();
 TT& geta(int r,int k);
 //метод для инициализации закрытого поля
 void set(int r,int k,TT b);
 //дружественная функция для сглаживания матрицы
 friend void sglag(const array2<TT>& t1,array2<TT>& t2,int n,int m);
};
//***** Определение функции для сглаживания матрицы *****//
template <class TT>
void sglag(const array2<TT>& t1,array2<TT>& t2,int n,int m)
{//Объявление массива и переменных
int i,j,r,k,l;
t s;
for(i=0;i<t1.n;i++)
   {for(j=0;j<t1.m;j++)
      {s=0;
       r=0;
       for (k=0;k<t2.n;k++)
        {for (l=0;l<t2.m;l++)
           {if((t2.n!=i)&&(t2.m!=j)&&(t2.n>=0)&&(t2.m>=0)&&(t2.n>=i-1)&&(t2.n<=i+1)&&(t2.m>=j)&&(t2.m<=j+1))  {s=s+t2.a[i][j];
                                                                                                               r++;
                                                                                                              }
           }
        }
    s=s/r;
    t2.a[i][j]=s;
    }
}
//***** Пользовательская функция вставки для двумерного массива *****//
template <class TT>
istream& operator>>(istream& is,array2<TT>& ob)
{TT temp;
 char s1[80], s2[80];
 CharToOem("\nВведите ", s1);
 CharToOem("\nстроку\n", s2);
  int i,j;
  for(i=0;i<ob.getn();i++)
     {cout<<s1<<i;
       cout<<s2;
       for(j=0;j<ob.getm();j++)
          {is>>temp;
           ob.set(i,j,temp);
          }
      }
 return is;
}
//***** Пользовательская функция извлечения для двумерного массива *****//
template <class TT>
ostream& operator<<(ostream& os, array2<TT> ob)
{int i,j;
  for(i=0;i<ob.getn();i++)
     {os<<endl;
       for(j=0;j<ob.getm();j++)
          {os<<setw(10)<<setprecision(4)<<ob.geta(i,j);
          }
      }
 return os;
}
//***** Конструктор для двумерного массива *****//
template <class TT>
array2<TT>::array2(int nn,int nm)
{n=nn;
  m=nm;
  //выделение  места под массив
  a=new TT* [n];
  if(a==NULL){cout<<"\nNet OP";
                          exit(1);
                         }
 for(int i=0;i<n;i++)
    {a[i]=new TT [m];
      if(a[i]==NULL){cout<<"\nNet OP";
                                  exit(1);
                                }
    }
}
//***** Конструктор по умолчанию для двумерного массива *****// 
template <class TT>
array2<TT>::array2()
{
}
//***** Конструктор копий для двумерного массива *****//
template <class TT>
array2<TT>::array2(const array2& ob)
{n=ob.n;
  m=ob.m;
  int i,j;
  a=new TT* [n];
  if(a==NULL){cout<<"\nNet OP";
                          exit(1);
                         }          
 for(i=0;i<n;i++)
    {a[i]=new TT[m];
      if(a[i]==NULL) {cout<<"\nNet OP";
                                  exit(1);
                       }
 }
for(i=0;i<n;i++)
   for(j=0;j<m;j++)
      a[i][j]=ob.a[i][j];
}
//***** Деструктор для двумерного массива *****//
template <class TT>
array2<TT>::~array2()
{
}
//***** Определение методов доступа для двумерного массива *****//
template <class TT>
int array2<TT>::getn()
{return n;
}
template <class TT>
int array2<TT>::getm()
{return m;
}
template <class TT>
TT& array2<TT>::geta(int r,int k)
{return a[r][k];
}
//***** Мeтод для инициализации закрытого поля для двумерного массива *****// 
template <class TT>
void array2<TT>::set(int r,int k,TT b)
{a[r][k]=b;
}
//Главная функция
void main()
{int i,j;
 char str[80];
 CharToOem("\nВведите размеры матрицы\nколичество строк  ", str);
 cout<<str;
 cin>>i;
 CharToOem("\nколичество столбцов  ",str);
 cout<<str;
 cin>>j;
 array2<double> Q(i,j);
 array2<double> X(i,j);
 CharToOem("\nВведите матрицу\n",str);
 cout<<str;
 cin>>Q;
 CharToOem("\nПечать матрицы",str);
 cout<<str;
 cout<<Q;
 //сглаживание
 sglag(Q,X);
 CharToOem("\nМатрица, полученная после cглаживания исходной матрицы\n",str);
 cout<<str;
 cout<<X<<endl;
}
Добавлено через 45 секунд
извиняюсь, свернуть не получилось...
Василий-Робот
TECHNO
26 / 26 / 5
Регистрация: 04.11.2009
Сообщений: 366
30.10.2010, 17:49 #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
40
41
42
43
44
45
46
47
48
49
#include <conio.h>
#include <stdio.h>
#include <iostream>
int main()
{
float A[10][10],B[10][10],s=0,s1,s2,s3,s4;
int n,i,j,a=1,b=1,c=1,d=1,k=4,;
printf(" n = "); scanf("%d",&n); 
printf("\n");
printf("OLD MATRIX:\n");
printf("\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
A[i][j]=(float)(rand()%10);
printf("%5.1f",A[i][j]);
}
printf("\n");
}
printf("\n");
printf("NEW MATRIX:\n");
printf("\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
k=4; s=0; a=1; b=1; c=1; d=1;
if(i==0) {a=0; k--;}
if(i==n-1) {b=0; k--;}
if(j==0) {c=0; k--;}
if(j==n-1) {d=0; k--;}
s=(b*A[i+1][j]+a*A[i-1][j]+c*A[i][j-1]+d*A[i][j+1])/k;
s1=d*A[i+1][j];
s2=c*A[i-1][j];
s3=b*A[i][j-1];
s4=a*A[i][j+1];
/*printf("\n %3.1f",s1);
printf("\n %3.1f",s2);
printf("\n %3.1f",s3);
printf("\n %3.1f",s4);
printf("\n %4d",k);*/
B[i][j]=s; printf("%5.1f",B[i][j]);
}
printf("\n");
}
getch();
return 0;
}
0
Nameless One
30.10.2010, 17:53
  #11

Не по теме:

Цитата Сообщение от Василий-Робот Посмотреть сообщение
Мой код:
приветствуем нового некроманта!

0
Василий-Робот
TECHNO
26 / 26 / 5
Регистрация: 04.11.2009
Сообщений: 366
30.10.2010, 18:18 #12
Кстати, Nameless One, как выделять текст "не по теме"?
0
Nameless One
30.10.2010, 18:36
  #13

Не по теме:

Василий-Робот, есть такой тег - "off" - на панели быстрого ответа между смайлами и тегом "cut"

1
Vladena
0 / 0 / 0
Регистрация: 02.06.2016
Сообщений: 2
02.06.2016, 14:11 #14
Кому не сложно. Помогите пожалуйста.
Соседями элемента Аij в матрице назовем элементы Аkl c i–1 ≤ k ≤ i+1, j–1 ≤ l ≤ j+1, (k, l) ≠ (i, j). Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент которой получается, как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы. Построить результат сглаживания заданной вещественной матрицы размером 10 × 10. В сглаженной матрице найти сумму модулей элементов, расположенных ниже главной диагонали.
0
02.06.2016, 14:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2016, 14:11
Привет! Вот еще темы с ответами:

Перестановка столбцов вещественной квадратной матрицы - C++
#include &lt;iostream&gt; using namespace std; int main() { char ans; do{ setlocale(LC_ALL, &quot;rus&quot;); int n =...

Перестановка элементов квадратной вещественной матрицы - C++
Здравствуйте. Задача такая: Путем перестановки элементов квадратной вещественной матрицы добиться того, чтобы ее максимальный элемент...

В процедуре поменять местами столбцы вещественной матрицы - C++
описать процедуру SwapCol (A,M,N,K1,K2), осуществляющую перемену местами столбцов вещественной матрицы А размера M на N с номерами К1 и К2....

Отсортировать элементы строк вещественной матрицы по не возрастанию - C++
Имеется готовый код. но он работает с целыми числами, а приспособить к вещественным не выходит Заголовочная фунцкии #pragma once ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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