17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
1

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

30.11.2011, 15:18. Показов 7842. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть две программы. 1-ая это прямое преобразование Хаара. 2-ая это собственно обратное. Что нужно бы сделать. Нужно считать файл input.dat проделать преобразования 1-ой программой, и получить файл output.dat в которое выводиться это преобразование. Затем взять файл ounput.dat и проделать обратное преобразование 2-ой программой и вывести в файл output2.dat, чтобы потом можно было сравнить с файлом input.dat. вывод должен происходить в столбик. Число элементов массива в каждом файле можно записать в начале. И самый главный вопрос, можно ли сделать так, чтобы при вводе появлялась консоль, в которой бы запрашивалась имя входного и выходного файла. Искал в интернете ничего про это не нашел, кроме того что в UNIX можно перенаправлять потоки и таким образом это реализовывать. А как это сделать для WINDOWS не очень понятно. может кто подскажет где про это можно почитать, или даст какой нибудь пример кода...или просто подсказку. Если нужно код 1ой и 2ой программы выложу.
Заранее спасибо за помощь!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2011, 15:18
Ответы с готовыми решениями:

Вейвлет Хаара
День добрый. Написал (точнее, перевёл с с++ на шарп) класс для вейвлет-преобразования по...

Двумерное прямое и обратное вейвлет-преобразование Хаара, матлаб
Подскажите пожалуйста, как сделать двумерное прямое и обратное вейвлет-преобразование Хаара в...

Вейвлет-анализ. Как работает вейвлет-преобразование?
Помогите разобратся как работает вейвлет-преобразование Как программно реализовать я знаю. но не...

Заменить в программе, переводящую строку в двоичный код, консольный ввод/вывод на файловый ввод/вывод
Добрый день! Помогите, пожалуйста, с программой. Программа считывает строку с клавиатуры и...

32
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
02.12.2011, 15:06  [ТС] 21
Author24 — интернет-сервис помощи студентам
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. И в файлах всё должно быть записано в столбик. а не в строку.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
02.12.2011, 17:26 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 секунд

Не по теме:

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

1
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
04.12.2011, 04:33  [ТС] 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;
}
переделывая вот этот код..
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
04.12.2011, 12:09 24
Можно. Просто считывайте два массива и над каждым делайте то, что нужно. Только помните, что данная реализация всегда дает с одного исходного два преобразованных массива.
0
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
05.12.2011, 19:06  [ТС] 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
0
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
07.12.2011, 00:25  [ТС] 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;
}
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
07.12.2011, 14:09 27
Цитата Сообщение от maniac0192 Посмотреть сообщение
как реализовать алгоритм обратного?
У вас есть формулы расчетов коэффицентов для преобразования Хаара. Из двух получившихся рядов коэффициентов можно составить формулу расчета исходных значений сигнала.
0
7 / 7 / 1
Регистрация: 29.03.2011
Сообщений: 81
07.12.2011, 17:09 28
Может конечно не в тему. Но зачем городить такие сложности, если есть программа 1 и 2, то почему бы не написать *.bat файл в котором задать последовательность запуска программ а имя входных и выходных файлов просто как переменные нести?!
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
07.12.2011, 17:12 29
Driim, понимаете, можно сделать все, что угодно. На данном этапе более рационально решать актуальные задачи, а подобную "косметику" нанести всегда успеется.
0
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
07.12.2011, 17:44  [ТС] 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 минуты
И еще маленький вопрос, как сделать так чтобы после каждого преобразования у меня отступалась строка чтобы коэффициенты полученные при преобразовании как бы групировались
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
07.12.2011, 18:15 31
Цитата Сообщение от maniac0192 Посмотреть сообщение
И еще маленький вопрос, как сделать так чтобы после каждого преобразования у меня отступалась строка чтобы коэффициенты полученные при преобразовании как бы групировались
Не понял вопрос. Переформулируйте.
0
7 / 7 / 1
Регистрация: 29.03.2011
Сообщений: 81
08.12.2011, 09:51 32
Про BAT... можно начать с вики а дальше гугл поможет.

Сейчас времени нет, разобраться в вашей программе, после обеда посмотрю, может чем и помогу.
0
17 / 17 / 5
Регистрация: 27.11.2011
Сообщений: 141
10.12.2011, 16:57  [ТС] 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.....и так далее.....если непонятно,то скажите где именно попробую пояснить идею....
0
10.12.2011, 16:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2011, 16:57
Помогаю со студенческими работами здесь

Поменять консольный ввод-вывод на файловый ввод-вывод
вот у меня калькулятор как мне сделать что б числа вводились из файла и результат записывался в...

Запись выражений, ввод–вывод информацииЗапись выражений, ввод–вывод информации
Задача 2.1. Пользуясь только операцией умножения, вычислить (A в 7-ой степени) за четыре операции....

Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур
Добрый вечер)) У меня небольшой вопрос. Почему первые буквы (в названии книг) не выводит на экран?...

Каскады хаара
Всем привет. Кто нибудь пожалуйста дайте ссылку для скачивания cvhaartraining.lib, очень нужна эта...


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

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

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