Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2011, 00:27   #1
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию Управление матрицей, сохраненной из Memo

Здравствуйте, всех с наступающим. У меня вопрос: я пытаюсь написать код, который строит спектрограмму для данных (пока .wav или .dat). У меня есть кусок кода, который строит картинку на Image из массива данных, сохраненного в .txt файле (все примеры для наглядности во вложении). Задумка такая, что у меня есть файл какой-то длины N. Я разбиваю его на K участков, длиной N1 каждый. От каждого беру БПФ, немножко химичу и вывожу сумму этих преобразованных участков, которые должны мне дать спектрограмму.
Главная проблема в том, что я не могу сохранить матрицу в файл, чтобы у нее было задаваемое мной количество строк, и, соответственно, столбцов. Я подумал использовать функцию Length, которая возвращает количество символов в строке, но она, вроде, только для чтения, или я неправильно использую ее.
Весь проект, картинка желаемой спектрограммы и файл с матрицей (в архиве в папке data) во вложении . За любую помощь заранее огромное спасибо.
Изображения
Тип файла: jpg signal PG.jpg (47.4 Кб, 129 просмотров)
Вложения
Тип файла: rar испытания.rar (5.71 Мб, 15 просмотров)
sergobrit вне форума Ответить с цитированием
Старый 01.01.2012, 04:12   #2
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

матрица - это всего лишь массив массивов, поэтому записывайте последовательно элементы массива:
Код:
var
  I, J: Integer;
  a: array [1..10, 1..20] of Integer;
begin
  for I := 1 to 10 do
    for J := 1 to 20 do
    begin
      Memo1.Lines.Add(IntToStr(a[I, J]));
    end;
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 07.01.2012, 00:24   #3
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию

Спасибо за подсказку, но я не понимаю, как сохранить значения, которые у меня хранятся в переменной s , в этот массив.

Код:
Memo1.Clear;
     FastFourierTransform(Xk,n,False);
     for i := 0 to 2*n - 1 do
     begin
     Max:=Abs(Xk[1]);
     //Form1.fs2.AddXY(i,Abs(Xk[i]));
     s:=s+' '+ FloatToStr(round(Abs(Xk[i]/Max)));
     end;

     begin
     for I := 1 to K do
     for J := 1 to N1 do
     begin
       SetLength(a, K, N1);

       Memo1.Lines.Add(IntToStr(K) + ' ' + IntToStr(N1) + #13#10 + IntToStr(a[I, J]));
     end;
     end;
     //запись матрицы в файл
     memo1.lines.SaveToFile('Matrix.txt');
sergobrit вне форума Ответить с цитированием
Старый 07.01.2012, 00:28   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

а что мешает после
Код:
     s:=s+' '+ FloatToStr(round(Abs(Xk[i]/Max)));
вот это
Код:
round(Abs(Xk[i]/Max
записать сразу в матрицу?
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 07.01.2012, 13:52   #5
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию

Цитата:
а что мешает после
Код:

s:=s+' '+ FloatToStr(round(Abs(Xk[i]/Max)));

вот это
Код:

round(Abs(Xk[i]/Max

записать сразу в матрицу?
Первоначально (до введения массива a[]) у меня так и было -- после s была строчка Memo1.Add.Lines и сразу сохранение в файл. Вот и была проблема сохранить матрицу заданных размеров.
sergobrit вне форума Ответить с цитированием
Старый 07.01.2012, 14:15   #6
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

откуда вообще берется матрица если Xk у вас Вектор?
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 07.01.2012, 16:47   #7
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию

Да, Xk - вектор. Первоначально я выводил его содержимое в Memo, оттуда сохранял в файл. Далее я матрицу эту вывожу на TImage. Так вот, чтобы вывести ее, нужно чтобы сохранялась она в формате количество строк*количество столбцов, которые K*N1 соответственно. В строчке
Код:
Memo1.Lines.Add(IntToStr(K) + ' ' + IntToStr(N1) + #13#10 + IntToStr(a[I, J]));
, где вместо массива a[] стоял s, я вывожу сначала размерность матрицы, потом с новой строчки добавляю сами данные. Ну так когда я просто выводил s -- он записывал значения подряд, не ограничивая количество столбцов. chertovich посоветовал записывать матрицу через массив массивов a[] (первый коммент), вот только я не знаю, как мне данные сначала сохранить в этот двумерный массив.
sergobrit вне форума Ответить с цитированием
Старый 07.01.2012, 16:51   #8
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
var f:textfile;
{...}
assignfile(f,'output.txt');
rewrite(f);
writeln(f,K ,' ',N1);
for i:=1 to k do
begin
for j:=1 to n1 do
write(f,a[i,j],' ');
writeln(f);
end;
closefile(f);
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 07.01.2012, 18:38   #9
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию

Спасибо за код, Mad_Cat. Но тут, если я не ошибаюсь, массив записывается в текстовый файл. У меня проблема данные Xk (или s) поместить в этот массив. А сохранение у меня идет прямо из компонента Memo в файл, откуда я потом снова читаю (во вложении в самом начале исходник, если интересно или что-то неясно). На данный момент a[i,j] - пустой. Данные все в векторе s
sergobrit вне форума Ответить с цитированием
Старый 10.01.2012, 00:38   #10
sergobrit
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 18
По умолчанию

Поскольку тема как-то заглохла, а решение своей проблемы я не нашел, перефразирую:
а возможно ли в самом компоненте Memo регулировать количество строк/столбцов. У него есть свойство Lines, вот только не соображу, как задавать количество строк.
А возможно ли данные (они содержатся в векторе или массиве, не важно) поместить в компонент Stringgrid в виде матрицы уже заданной размерности? Ведь мне главное в текстовый файл сохранить правильную матрицу, не обязательно из Memo.

Последний раз редактировалось sergobrit; 10.01.2012 в 00:47.
sergobrit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Memo поверх других memo. qwertyk Общие вопросы Delphi 2 29.11.2011 22:00
Паскаль с матрицей Ikebama Помощь студентам 1 06.06.2011 21:52
работа с матрицей AleksENN Помощь студентам 0 23.10.2010 14:13
Перевод из Memo по английскому в Memo по русскому Sanek777 Общие вопросы Delphi 5 26.09.2008 00:17
В Memo сделать так, чтобы текст был разного цвета, разноцветный memo Artem Компоненты Delphi 3 07.09.2007 13:40