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

Вейвлет Хаара 2.Ввод и вывод. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.83
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
30.11.2011, 15:18     Вейвлет Хаара 2.Ввод и вывод. #1
Есть две программы. 1-ая это прямое преобразование Хаара. 2-ая это собственно обратное. Что нужно бы сделать. Нужно считать файл input.dat проделать преобразования 1-ой программой, и получить файл output.dat в которое выводиться это преобразование. Затем взять файл ounput.dat и проделать обратное преобразование 2-ой программой и вывести в файл output2.dat, чтобы потом можно было сравнить с файлом input.dat. вывод должен происходить в столбик. Число элементов массива в каждом файле можно записать в начале. И самый главный вопрос, можно ли сделать так, чтобы при вводе появлялась консоль, в которой бы запрашивалась имя входного и выходного файла. Искал в интернете ничего про это не нашел, кроме того что в UNIX можно перенаправлять потоки и таким образом это реализовывать. А как это сделать для WINDOWS не очень понятно. может кто подскажет где про это можно почитать, или даст какой нибудь пример кода...или просто подсказку. Если нужно код 1ой и 2ой программы выложу.
Заранее спасибо за помощь!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
02.12.2011, 15:06  [ТС]     Вейвлет Хаара 2.Ввод и вывод. #21
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
#include <iostream>
using namespace std;
int main ()
{
        int n; 
        std::cout << "Enter n:\n>";
        std::cin >> n;
        float* a = new float[n];
        std::cout<<"massiv a:\n";
        for (int i = 0; i <= n-1; i++)
        {
           std::cin >> a[i];
        }
        float* b = new float[n];
        std::cout<<"massiv b:\n";
        for (int j = 0; j <= n-1; j++)
        {
            std::cin >> b[j];
        }
         float* c = new float [n*2];
        std::cout<<"ishodnii: \n ";
        for(int k = 0, i = 0; i < n; k+=2, i++)
        {
                  c[k] = a[i] + b[i];
                  c[k+1] = a[i] - b[i];
        }
 
        for(int k=0; k<n*2; k++)
        {
                std:: cout<<c[k]<<endl<<" ";       
        }
        //system("pause");
}
вот код, хочу сделать так, чтобы я вводил массив не с клавиатуры а читал его из файла input.txt, а результат полученных преобразований выводил в файл output.txt. И в файлах всё должно быть записано в столбик. а не в строку.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
02.12.2011, 17:26     Вейвлет Хаара 2.Ввод и вывод. #22
Что мешает? Например так можно:
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
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
        int n; 
        int i;
        ifstream in("input.txt");
        if(!in)
        {
            cout<<"Input file not found!"<<endl;
            return 1;
        }
        in>>n;
        float* a = new float[n];
        float* b = new float[n];        
        float* c = new float[n*2];
        for(i=0;i<n;i++)
        {
            in>>a[i];
            in>>b[i];
        }
        in.close();
        ofstream out("output.txt");
        if(!out)
        {
            cout<<"Unable to create output file!"<<endl;
            delete []a;
            delete []b;
            delete []c;
            return 1;
        }
        out<<n*2<<endl;
        for(int k = 0, i = 0; i < n; k+=2, i++)
        {
                  c[k] = a[i] + b[i];
                  c[k+1] = a[i] - b[i];
                  out<<c[k]<<endl<<c[k+1]<<endl;
 
        } 
        out.close();
        delete []a;
        delete []b;
        delete []c;
        return 0;
}
Добавлено через 35 секунд

Не по теме:

Ничего себе табуляция уехала...

maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
04.12.2011, 04:33  [ТС]     Вейвлет Хаара 2.Ввод и вывод. #23
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 <iostream>
#include<fstream>
using namespace std;
 
int main ()
{
    int n;
    int i;
                ifstream in("input.txt");
                if(!in)
                {
                        cout<<"Input file not found!"<<endl;
                        return 1;
                }
                in>>n;
                
float* a = new float[n];
float *b=new float [n/2];
float *c=new float [n/2];
 
for (int k = 0; k <= n-1; k++)
{
    in>> a[k];
}
in.close();
                ofstream out("output.txt");
                if(!out)
                {
                        cout<<"Unable to create output file!"<<endl;
                        delete []a;
                        delete []b;
                        delete []c;
                        return 1;
                }
                out<<n*2<<endl;
                
for (int j=0; j<n/2 ; j++)
{      
         c[j]=(a[2*j]+a[2*j+1])/2;
         b[j]=(a[2*j]-a[2*j+1])/2;
        
        out<<c[j]<<endl<<b[j]<<endl;
}
                out.close();
                delete []a;
                delete []b;
                delete []c;
                return 0;
}
Большое спасибо за оказанную помощь, применил то же самое для прямого преобразования, всё работает. Извеняюсь за ещё один, наверное уже последний вопрос...вот код программы, и на выходе в файл output я получаю 2 массива. допустим на вод идёт последовательность 220, 211, 212, 218, 217, 214, 210, 202.
на выходе получу две (215.5, 215, 215.5, 206) и (4.5, -3, 1.5, 4). А можно ли сделать так, чтобы операция
C++
1
2
c[j]=(a[2*j]+a[2*j+1])/2;
         b[j]=(a[2*j]-a[2*j+1])/2;
повторилась для каждого из полученных массивов,т.е. теперь из (215.5, 215, 215.5, 206) получим (215.25, 210.75) (0.25, 4.75). из (4.5, -3, 1.5, 4) аналогично, и повторялась она для каждого нового полученного массива........это трудно написать??как подступиться к такой задаче.......??? Спасибо, если хоть чем то поможете....

Добавлено через 27 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int count = SIZE; count > array.Length / (2 * level); count /= 2)
            {
                // Рассчитать полусуммы и разности, занести во временные массивы сумм и разностей
                for (int i = 0; i < count / 2; i++)
                {
                    avg[i] = (array[2 * i] + array[2 * i + 1]) / 2;
                    diff[i] = array[2 * i] - avg[i];
                }
 
                // Перенести суммы и разности в итоговый массив
                for (int i = 0; i < count / 2; i++)
                {
                    array[i] = avg[i]; // В первую половину
                    array[i + count / 2] = diff[i]; // Во вторую половину
                }
            }
на самом деле, мне бы просто этот код перенести в C++. И оставить использование файлов...

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
for (int j=0; j<n/2 ; j++)
{      
         c[j]=(a[2*j]+a[2*j+1])/2;
         b[j]=(a[2*j]-a[2*j+1])/2;
        
        out<<c[j]<<endl<<b[j]<<endl;
}
переделывая вот этот код..
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
04.12.2011, 12:09     Вейвлет Хаара 2.Ввод и вывод. #24
Можно. Просто считывайте два массива и над каждым делайте то, что нужно. Только помните, что данная реализация всегда дает с одного исходного два преобразованных массива.
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
05.12.2011, 19:06  [ТС]     Вейвлет Хаара 2.Ввод и вывод. #25
да я понял, может вы сможете мне объяснить, как я могу сделать так, чтобы у маня следующее преобразование выводилось в соседний столбик, и пробывал я делать это для каждого измения, но не получается, выдаёт тот же массив, с теми же коэффицентами((я чесно не знаю как это реализовать(

Добавлено через 24 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int m = n/2; m > n/(2*level); m /=2 )
  {
for (int j=0; j<n/2 ; j++)
{      
         c[j]=(a[2*j]+a[2*j+1])/2; 
       
        out<<c[j]<<endl;
}
}
for(int m = n/2; m > n/(2*level); m /=2 )
  {
for (int j=0; j<n/2 ; j++)
{      
         b[j]=a[2*j]-c[j];
       
        out<<b[j+n/2]<<endl;
}
}
вот я не прав сдесь, не пойму в чём лажаю, вроде аналогично сделал

Добавлено через 17 часов 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(int count = n; count>m/4; count /=2)
{
        for (int j=0; j<n/2 ; j++)
            {        
                     c[j]=(a[2*j]+a[2*j+1])/2;
                     b[j]=(a[2*j]-a[2*j+1])/2;
            }
        for(int j=0; j<count/2;j++)
            {
                 out<<c[j]<<endl<<b[j]<<endl;
             }
}
всё равно не правильно выдаёт, хотя правильно считает первый раз

Добавлено через 40 минут
получается что преобразование делается 1 раз, а потом повторяется только вывод, но уже меньшего количества элементов

Добавлено через 37 секунд
и m = n/2
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
07.12.2011, 00:25  [ТС]     Вейвлет Хаара 2.Ввод и вывод. #26
Так, с прямым разобрался, осталось только один лишний коэффицент убрать и всё, а вот как реализовать алгоритм обратного????
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
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
        int n; 
                int i;
                ifstream in("output.txt");
                if(!in)
                {
                        cout<<"Input file not found!"<<endl;
                        return 1;
                }
                in>>n;
        float* a = new float[n];
                float* b = new float[n];        
        float* c = new float[2*n];
                for(i=0;i<n;i++)
                {
                        in>>a[i];
                        in>>b[i];
                }
                in.close();
                ofstream out("output1.txt");
                if(!out)
                {
                        cout<<"Unable to create output file!"<<endl;
                        delete []a;
                        delete []b;
                        delete []c;
                        return 1;
                }
                out<<n<<endl;
        for(int k = 0, i = 0; i < n/4; k+=2, i++)
        {
                  c[k] = a[i] + b[i];
                  c[k+1] = a[i] - b[i];
                  out<<c[k]<<endl<<c[k+1]<<endl;
 
        } 
                out.close();
                delete []a;
                delete []b;
                delete []c;
                return 0;
}
если для прямого выполняется так
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
#include <iostream>
#include<fstream>
using namespace std;
 
int main ()
{
    int n;
    int i;
                ifstream in("input.txt");
                if(!in)
                {
                        cout<<"Input file not found!"<<endl;
                        return 1;
                }
                in>>n;
                
float* a = new float[n];
float *b=new float [n/2];
float *c=new float [n/2];
 
for (int k = 0; k <= n-1; k++)
{
    in>> a[k];
}
in.close();
                ofstream out("output.txt");
                if(!out)
                {
                        cout<<"Unable to create output file!"<<endl;
                        delete []a;
                        delete []b;
                        delete []c;
                        return 1;
                }
                out<<2*(n-1)<<endl;
do
{
  float *c=new float [n/2];
  float *b=new float [n/2];
  for (int j=0; j<n/2; j++)
      {        
               c[j]=(a[2*j]+a[2*j+1])/2;
               b[j]=(a[2*j]-a[2*j+1])/2;
               out<<c[j]<<" "<<" "<<" "<<" "<<" "<<b[j]<<endl;
      }
               delete []a;
               delete []b;
               b=c;
               a=c;
               n=n/2;
}
               while(n>=1);
                out.close();
                delete []c;
                return 0;
}
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
07.12.2011, 14:09     Вейвлет Хаара 2.Ввод и вывод. #27
Цитата Сообщение от maniac0192 Посмотреть сообщение
как реализовать алгоритм обратного?
У вас есть формулы расчетов коэффицентов для преобразования Хаара. Из двух получившихся рядов коэффициентов можно составить формулу расчета исходных значений сигнала.
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
07.12.2011, 17:09     Вейвлет Хаара 2.Ввод и вывод. #28
Может конечно не в тему. Но зачем городить такие сложности, если есть программа 1 и 2, то почему бы не написать *.bat файл в котором задать последовательность запуска программ а имя входных и выходных файлов просто как переменные нести?!
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
07.12.2011, 17:12     Вейвлет Хаара 2.Ввод и вывод. #29
Driim, понимаете, можно сделать все, что угодно. На данном этапе более рационально решать актуальные задачи, а подобную "косметику" нанести всегда успеется.
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
07.12.2011, 17:44  [ТС]     Вейвлет Хаара 2.Ввод и вывод. #30
Нет, я не про это, смотрите, во второй программе там всё чётко возвращается, исходный массив находится, просто в прямом разложении я получаю кучу массивов, разных. А могу я получать их в обратном преобразовании тоже пошагово как в прямом, т.е было (215.25, 210.75) (0.25, 4.75) получил (215.5, 215, 215.5, 206) , а из массива разностей тоже было 2, а получил (4.5, -3, 1.5, 4). записал в файл, а потом взял полученые, опять 2 и получил новый.
И можете рассказать, что за BAT файл, просто чтобы почитать посмотреть, вдруг как раз пригодится потом..

Добавлено через 3 минуты
И еще маленький вопрос, как сделать так чтобы после каждого преобразования у меня отступалась строка чтобы коэффициенты полученные при преобразовании как бы групировались
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
07.12.2011, 18:15     Вейвлет Хаара 2.Ввод и вывод. #31
Цитата Сообщение от maniac0192 Посмотреть сообщение
И еще маленький вопрос, как сделать так чтобы после каждого преобразования у меня отступалась строка чтобы коэффициенты полученные при преобразовании как бы групировались
Не понял вопрос. Переформулируйте.
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
08.12.2011, 09:51     Вейвлет Хаара 2.Ввод и вывод. #32
Про BAT... можно начать с вики а дальше гугл поможет.

Сейчас времени нет, разобраться в вашей программе, после обеда посмотрю, может чем и помогу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2011, 16:57     Вейвлет Хаара 2.Ввод и вывод.
Еще ссылки по теме:

Товарищи помогите с вейвлетом Хаара C++
C++ Прямое и обратное преобразование Хаара
C++ Поменять консольный ввод-вывод на файловый ввод-вывод

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

Или воспользуйтесь поиском по форуму:
maniac0192
17 / 17 / 3
Регистрация: 27.11.2011
Сообщений: 141
10.12.2011, 16:57  [ТС]     Вейвлет Хаара 2.Ввод и вывод. #33
было (220, 211, 212, 218, 217, 214, 210, 202), стало a1 и b1: (215.5, 215, 215.5, 206) и (4.5, -3, 1.5, 4)
вот я сделал чтобы массивы сумм и массивы разностей записывались в 2 столбика, а теперь вопрос
215.5
215
215.5
206
сдесь строчка пропущена

215.5
215

213
вот как прописать пропуск строчки чтобы массивы преобразования 1 были в двух разный столбцах, потом строчка пустая, потом новые уже 4 массива, потом 8 и так далее, чтобы после очередного повтора одна строчка пропускалась. и может это сделать как нибудь еще поинтереснее, красивее, что подскажете????может первый столбец это исходные второй третий это новые массивы разности и сумм(размер один и тот же), 4ый 5, 6, 7 новые массивы разностей и сумм при преобразовании массивов 2 и 3.....и так далее.....если непонятно,то скажите где именно попробую пояснить идею....
Yandex
Объявления
10.12.2011, 16:57     Вейвлет Хаара 2.Ввод и вывод.
Ответ Создать тему
Опции темы

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