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

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

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

По заданной вещественной матрице N*M найти C++
Построить результат сглаживания заданной вещественной матрицы размером 10 на 10. C++
класс вещественной матрицы C++
C++ В заданной числовой вещественной матрице размерности N*N поменять местами K-ую строку и L-ую строку
Перестановка элементов квадратной вещественной матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
01.10.2008, 21:59     Построить результат сглаживания заданной вещественной матрицы #2
ну и чего тут сложного .
1)создаешь новую матрицу
2)делаешь два цикла и переносишь с вычислением результат. по краям соседей нет поэтому их не учитываешь
3) заменяешь старую на новую
примечание : не пытайся обходиться дез новой . будет глюк ,прога сложнее будет,скорость меньше ,толку еще меньше.
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();
 }
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2218 / 733 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
01.10.2008, 23:53     Построить результат сглаживания заданной вещественной матрицы #4
paul, Код оформлен ужасно,ни комментариев,ни функций,ни констант. Разбираться в четырех вложенных циклах не хочется,да и код ты,видимо,не сам писал,раз не можешь догадаться,что можно очень прямолинейно перед делением на n вычесть этот элемент.а можно вот в это
Код
(l<0||l>=10)||(k!=i && l!=j )
условие,которое,кстати,записано неправильно, добавить еще одно
Код
  || ( (k==i)&&(l==j) )
paul
0 / 0 / 0
Регистрация: 16.03.2008
Сообщений: 18
02.10.2008, 00:20  [ТС]     Построить результат сглаживания заданной вещественной матрицы #5
С
Код
|| ( (k==i)&&(l==j) )
ничего не получается, и с этим условием оно так считает что я не пойму каким образом создается новый элемент.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2218 / 733 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
02.10.2008, 00:27     Построить результат сглаживания заданной вещественной матрицы #6
paul, я примерно могу сказать,каким образом он создается. Но ошибка в твоем коде,не в моем. Я даже указал где,и еще подскажу,что операции != и && имеют одинаковый приоритет
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)))
Все норм работает.
qwone
8 / 8 / 1
Регистрация: 18.08.2008
Сообщений: 129
02.10.2008, 01:27     Построить результат сглаживания заданной вещественной матрицы #8
да код накрутил будь здоров .там проще могло быть.
Юся
Сообщений: n/a
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;
}
Nameless One
30.10.2010, 17:53
  #11

Не по теме:

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2016, 14:11     Построить результат сглаживания заданной вещественной матрицы
Еще ссылки по теме:

C++ В процедуре поменять местами столбцы вещественной матрицы
Считывание вещественной матрицы из файла C++
Описать процедуру выполняющую транспонирование квадратной вещественной матрицы C++

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

Или воспользуйтесь поиском по форуму:
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. В сглаженной матрице найти сумму модулей элементов, расположенных ниже главной диагонали.
Yandex
Объявления
02.06.2016, 14:11     Построить результат сглаживания заданной вещественной матрицы
Ответ Создать тему
Опции темы

Текущее время: 08:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru