Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Matrix32   Найти похожие ветки 

 
Loginov Dmitry ©   (2006-11-01 17:55) [0]

Потребовалось ровно два месяца, чтобы разработать новый матричный движок.

Старый Matrix не мог удовлетворить все потребности программиста, которые
возникали при работе с массивами. Ограничения были весьма жесткими:
поддерживались исключительно 2-мерные массивы. Элемены массива могли
иметь только один тип - Real. Преимущества ООП использовались слабо.
Изначально Matrix мною разрабатывался как средство, которое смогло бы
упростить работу с нейронными сетями (точнее без гемороя передрать их из
Матлаба). Но эта задача крайне сложная. Матлаб использует множество типов
данных, среди которых были ячейки и записи, которыми старый Matrix не
располагал. Да и программировать я ее начал почти 2 года назад, хотя
уровень был "ниже плинтуса". На старую версию убил почти год, причем раза
3 все это дело переписывал. Но ничего хорошего из этого не вышло, и не
могло выйти. Прошел год и два месяца, когда я впервые появился на этом
форуме, и заявил о своей "великой" разработке.

И вот теперь я скромно заявляю: начало положено. Движок разработан. Все
необходимое делает. На сайте лежит вполне рабочая версия.

Попытаюсь выполнить крайне сложную аналитическую задачу - перечислить
основные функции и возможности Matrix32:

- Поддерживаются структуры, массивы ячеек и многомерные массивы.
(Структура - это объект, не являющийся массивом, но являющийся владельцем
других именованных объектов; Массив ячеек - это многомерный массив,
элементыми которого являются указатели на другие объекты; Многомерные
массивы - массивы, элементами которых являются объекты любых стандартных
типов, в частности - числовых).

- Поддерживаются многомерные массивы всех числовых типов Delphi, начиная
от Byte и заканчивая Extended. Также поддерживаются многомерные массивы
комплексных чисел.

- Оставлен объект TWorkspace. Его назначение уже не так очевидно, как
прежде. Раньше TWorkspace был хранилищем массивов, и любая работа с
массивами выполнялась через него. Теперь же все массивы выполнены в виде
объектов и унаследованы от класса TMatrix. Любой массив может быть
владельцем других массивов. Теперь его основное назначение - это работа с
двоичными файлами. Иногда бывает удобно для решения определенной задачи
сгруппировать массивы по рабочим областям, и при необходимости одной
командой сохранить все эти объекты в файл (или загрузить из файла)

- Реализованы функции по работе с потоками и двоичными файлами. Если в
старой версии использовались файлы целых трех форматов, то теперь только
один - двоичный. Дело в том, что текстовый формат не позволяет наглядно
отобразить элементы массива, имеющего более 2-х измерений. Сохранить в
файл можно любой объект, и не важно что он имеет еще сотню-другую
дочерних объектов. Величина вложенности структур на работу данных функций
роли никакой не играет. (А вложенность не ограничивается. Т.е. вы можете
создать структуру, элементами которой будут другие структуры, те
структуры хранять указатели еще на какие-либо объекты и т.д.). Любой
объект можно сохранить не только в файл, но и в поток. А поток - это вещь
вовсе универсальная. Хочешь в файл ее, хочешь - в табличку БД пихай. Ну и
конечто же все это можно загрузить обратно.

- Изменена обработка исключений. Если раньше при генерации исключения
вызывался метод DoError() с единственным параметром, то теперь помимо
текста ошибки необходимо указывать еще и имя фукнции. Типичный пример:
DoError(matSOutOfMemory, "procedure TMatrix.CheckMemoryForResize");
В результате этого на экране появляется окошко с развернутым сообщением
об ошибке, и вы сразу поймете, из-за чего возникла ошибка и в каком
месте. Все исключения генерируются с помощью класса EMatrixError.

- Что касается многомерных числовых массивов, то для них реализовано
очень много различных функций, например, операция конкатенации Concat,
копирование участка одного массива в другой массива CopyArrayPart,
необходимые вычислительные операции и многое многое другое.

- Очень важный момент - все числовые массивы в Matrix32 полностью
совместимы друг с другом. Например все операции, которые можно проделать
над экземпляром класса TExtendedComplexMatrix, также можно проделать и
над экземпляром класса TByteMatrix. Так что если вам захочется написать
функцию для обработки любых массивов вне зависимости от типа элементов,
то сделайте так, чтобы она принимала аргумент в виде указателя на
TMatrix, а не на TByteMatrix (к примеру). Вообще имена типов лучше
использовать только при создании объекта. Типовой пример создания
объекта:


var
 M: TMatrix;
begin
 M := TByteMatrix.Create;
 try
   // Операторы обработки
 finally
   M.Free;
 end;
end;


Что касается внедрения различных вычислительных алгоритмов, то в ядре их
не будет. Там и так много всего есть, и засорять лишним не имеет смысла.

Я надеюсь, что теперь благодаря данной системе, часть задач
программистов, связанных с работой с массивами, будет реализовать намного
проще. Мне эта система точто должна помочь.

Здесь я не описал и половины всех возможностей системы (эта задача
оказалась действительно сложной).
Взаимодействия с Матлабом пока нет. Возможно оно будет реализовано
когда-нибудь в отдельном модуле (но когда именно - сказать не могу).

Модуль - не маленький - более 7000 строк, 220 Кбайт.

А вот ссылочка:
http://matrix.kladovka.net.ru/download.php?getfilename=uploads/heart/matrix2.zip


 
Jeer ©   (2006-11-01 18:08) [1]

Похвально.

Главное - не сдаваться:))


 
jack128 ©   (2006-11-01 18:16) [2]

Смешно почитать коментарии  :-)

   {Конструктор. Не стоит его перекрывать в классе - потомке. Все необходимые
    действия при создании объекта можно выполнить, перекрыв процедуру Init.
    Именно по-этому здесь нет директивы VIRTUAL.
    Имя массива - параметр необязательный, однако его необходимо задавать,
    если вы используйте операции, использующие это имя. Также оно требуется
    при задании рабочей области AOwner <> nil}
   constructor Create(AOwner: TMatrix = nil; const AName: TMatrixName = ""); virtual;


(jack128  - выделено мной) :-))


 
Jeer ©   (2006-11-01 18:26) [3]

jack128 ©   (01.11.06 18:16) [2]

Да этот опус (Matrix) - давно читается как одна из книг Д.Дефо:))
Захватывает как ребус (что же не так сделано) и "мягкий" exit.
Ну пусть, там, сам по себе, MatLab, живет и дальше:)))))))))))


 
Loginov Dmitry ©   (2006-11-01 20:19) [4]

jack128 ©   (01.11.06 18:16) [2]


Спасибо! Не всем комментариям нужно слепо верить :))


 
Loginov Dmitry ©   (2006-11-01 20:23) [5]

Кстати, на размер exe-шника после подключения Matrix32 кто-нибуть обратил внимание?

:)


 
jack128(not home)   (2006-11-01 21:26) [6]


> Кстати, на размер exe-шника после подключения Matrix32 кто-
> нибуть обратил внимание

ну вроде увеличелся на ~70 кб. А что такого???

Ps Я щас тупой вопрос задам, а как задать кол-во измерений в массиве?


 
Суслик ©   (2006-11-01 22:28) [7]

открой опенсорсный проект на sourceforge.net.
может примкнет кто - все продукт качественней будет (хотя бы потому, что больше рук его будут тестировать).


 
Loginov Dmitry ©   (2006-11-01 23:35) [8]

jack128(not home)   (01.11.06 21:26) [6]
ну вроде увеличелся на ~70 кб. А что такого???


Да все в порядке. Просто я изначально регистрирую все необходимые классы, т.е. практически весь код модуля сразу линкуется. Зато это позволяет реализовать функции для сохранения и загрузки массивов из файлов и из потоков. За удобство приходится расплачиваться (правда можно использовать условную компиляцию)

как задать кол-во измерений в массиве?

Извиняюсь, что пока примеров работы с новой версией нет. Но это большой труд, сопоставимый с программированием всего этого. В основном все методы являются виртуальными и комментарии вы можете посмотреть в объявлении класса TMatrix. Вот пример по работе с многомерными массивами:


with TSingleMatrix.Create do
try
 // Сразу после создания массив имеет нулевой размер, кол-во размерностей и кол-во элементов равно нулю

 // Сделаем массив 4-мерным
 Resize([1, 2, 3, 4]);
 // Заполним случайными числами
 Rand(10000);
 // Изменим размеры без перераспределения памяти и без модификации элементов
 Reshape([3, 8]);
 // Изменим размеры с перераспределением памяти с необходимой перестройкой элементов
 PresaveResize([1,2,3,4,5,6,7]);
 // Отобразим на экране значение последнего элемента массива
 ShowMessage(GetElemStr([0,1,2,3,4,5,6]));
 // Отобразим последние 2 измерения массива в виде 2-мерной матрицы
 ShowMessage(AsString);
finally
 Free;
end;



 
Loginov Dmitry ©   (2006-11-02 12:42) [9]

> открой опенсорсный проект на sourceforge.net.
> может примкнет кто - все продукт качественней будет (хотя
> бы потому, что больше рук его будут тестировать).


Мне кажется, врядли там кто-нибудь примкнет. Там же в основном делают целевые программы, а не программные модули. А идея была бы неплохая...


 
Игорь Шевченко ©   (2006-11-02 14:08) [10]


> Не всем комментариям нужно слепо верить


Такому проекту место в Recycle Bin


 
Суслик ©   (2006-11-02 14:20) [11]


>  [9] Loginov Dmitry ©   (02.11.06 12:42)
> Мне кажется, врядли там кто-нибудь примкнет. Там же в основном
> делают целевые программы, а не программные модули. А идея
> была бы неплохая...


если проект стоящий (я не знаю, т.к. не смотрел), то обязательно кто-нить примкнет, ну или хотябы получишь обратную связь от пользоватлей.


 
esu ©   (2006-11-02 16:18) [12]


> - Реализованы функции по работе с потоками и двоичными файлами.
>  Если в
> старой версии использовались файлы целых трех форматов,
> то теперь только
> один - двоичный. Дело в том, что текстовый формат не позволяет
> наглядно
> отобразить элементы массива, имеющего более 2-х измерений.
>

Исключительно из любопытства: А чем двоичный формат более нагляден чем, скажем, xml ? :)


 
DiamondShark ©   (2006-11-02 16:45) [13]


> Исключительно из любопытства: А чем двоичный формат более
> нагляден чем, скажем, xml ? :)

Тебе лучше знать, ведь кроме тебя никто про наглядность двоичного формата не упоминал.


 
esu ©   (2006-11-02 17:47) [14]


> DiamondShark ©   (02.11.06 16:45) [13]

Дело в том, что текстовый формат не позволяет наглядно
> отобразить элементы массива,


 
Loginov Dmitry ©   (2006-11-02 20:15) [15]

Игорь Шевченко ©   (02.11.06 14:08) [10]
Такому проекту место в Recycle Bin


А может Вашим проектам место в Recycle Bin?
(<я о том, что нефиг болтать ерундой>)

esu ©   (02.11.06 16:18) [12]
Исключительно из любопытства: А чем двоичный формат более нагляден чем, скажем, xml ?


Не существует такого формата, который бы мог наглядно отобразить элементы многомерных массивов (к xml это тоже относится).
В текстовом формате наглядно можно отобразить только элементы 1- и 2-мерных массивов. Из-за подобных ограничений я не стал делать акцента на данном формате.


 
Игорь Шевченко ©   (2006-11-02 22:17) [16]

Loginov Dmitry ©   (02.11.06 20:15) [15]


> (<я о том, что нефиг болтать ерундой>)


А я не пыжусь, заводя ветки о своих проектах.


 
furyz ©   (2006-11-02 22:19) [17]

Баян =)


 
Ketmar ©   (2006-11-02 22:56) [18]

>[16] Игорь Шевченко(c) 2-Nov-2006, 22:17
>А я не пыжусь, заводя ветки о своих проектах.
а остальные -- пыжатся.

http://delphimaster.net/view/15-1158621901/
http://delphimaster.net/view/15-1158621901/
и ты пы.

%-)


 
Loginov Dmitry ©   (2006-11-02 23:20) [19]

Игорь Шевченко ©   (02.11.06 22:17) [16]
А я не пыжусь, заводя ветки о своих проектах.


Ну раз заводить не о чем, чтож, сочувствую...


 
Loginov Dmitry ©   (2006-11-06 19:42) [20]

Исправил несколько глюков. Добавил новые...
Добавил несколько новых функций. В том числе MatrixRefIsValid(), проверяющая актуальность ссылки на основании проверки GUID"a.
Подрихтовал работу с потоками (были кое-какие глючки).

Проверил работоспособность под Дельфи 2005. Компилируется без единого замечания.
Попробовал скомпилировать под .NET, не компилится. То Pointer для него UNSAFECODE, то функциям не допускается возвращать результат типа Pointer. Безпердел в общем :)

Написал утилитку, которая перегоняет двоичные файлы старой версии в формат новой версии (для ее компиляции необходимо наличие обеих версий). Быть может, кому-нибудь да пригодится.
Начал внедрение новой версии в собственные проекты (старая версия заменяется новой). Работает. Сам не ожидал :)

Примеры работы с Matrix32 собраны в модуле matrixDemos.

Тама объявлены 2 процедуры: Fast3PointInterp() и StretchRows().
Первая реализует параболическую интерполяцию (интерполяцию по трем точкам)
Вторая - "масштабирование" строк матрицы. То есть может растянуть строки или сжать их.
Обе умеют работать с массивами любых размерностей (в Matrix32 массив любой размерности можно представить в виде совокупности строк определенной длины).

Пример использования:


procedure TForm1.Button3Click(Sender: TObject);
var
 I: Integer;
begin
 Series1.Clear;
 Series2.Clear;
 with TSingleMatrix.Create do
 try
   Colon(0, 0.5, Pi); // Формируем последовательность [0, 0.5, 1, 1.5, ... Pi)
   CalcFunction(ThisMatrix, fncSin);

   // Получили ломаную синусойду из семи точек. Рисуем ее
   for I := 0 to Cols - 1 do
     Series1.Add(VecElem[I], "", clGreen);

   StretchRows(ThisMatrix, ThisMatrix, 100);

   // Благодаря интерполяцию получили гладкую кривую, состоящую из 100 точек.
   for I := 0 to Cols - 1 do
     Series2.Add(VecElem[I], "", clRed);
 finally
   Free;
 end;
end;


Для всего этого понадобилась только одна переменная - счетчик цикла.

Субъективно могу отметить, что программировать с использованием новой версии стало проще, чем в предыдущей.
(на самом деле я очень боялся, что из-за такого значительного увеличения возможностей системы программирование сильно затруднится).

Размер модуля системы - 7600 строк (230 КБайт)
Размер архива - 50 Кбайт.


 
Loginov Dmitry ©   (2006-11-09 07:40) [21]

Улучшена обработка исключительных ситуаций.
Теперь при возникновении ошибок разработчику предоставляется не только текст и место возникновения ошибки, но и
вся цепь распространения ошибки. Правда функциональность этой цепочки должна обеспечиваться разработчиком. В
самом ядре реализована еще не полностью.
Пример:


procedure Proc1;
begin
 DoMatrixError("Произошла какая-то ошибка", "procedure Proc1");
end;

procedure Proc2;
begin
 try
   Proc1;
 except
   on E: Exception do DoMatrixError(E.Message, "procedure Proc2");
 end;
end;

procedure Proc3;
begin
 try
   Proc2;
 except
   on E: Exception do DoMatrixError(E.Message, "procedure Proc3");
 end;
end;



В результате будет сформирован следующий отчет об ошибке:



При работе вычислительной системы произошла ошибка
Время ошибки: 2006.11.08 23:32:11:046
Подробности:

Произошла какая-то ошибка

Цепь распространения ошибки:
procedure Proc1
procedure Proc2
procedure Proc3



Может преимущество такого подхода на первый взгляд неочевидно, ведь есть же под рукой отладчик и т и п.
Но для кого пишутся программы? Для пользователей.
Гораздо проще будет исправить ошибку, если пользователь предоставит такой отчет, чем если он заявит: у вас прога
глюченная. Выдает сообщение "access violation on address ......". Исправляйте. тчк.


 
Jeer ©   (2006-11-09 10:11) [22]

Слущай, а можно свой проект комментировать и освещать далее на своих страницах ?

У тебя отличный проект и отличный сайт.

Может не надо здесь зас@р@ь мозги ?


 
Anatoly Podgoretsky ©   (2006-11-09 10:34) [23]

> Jeer  (09.11.2006 10:11:22)  [22]

Хоть и грубо, но правильно, на протяжение многих лет ему на это неоднакратно указывали, и ветки закрывали, но не в коня корм.

Заводи сайт, а сюда анонс.


 
Loginov Dmitry ©   (2006-11-09 11:01) [24]

Закройте данную ветку, и все дела.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.041 c
15-1163001680
Cerberus
2006-11-08 19:01
2006.11.26
Компонет посведки PHP.


15-1162961226
vajo
2006-11-08 07:47
2006.11.26
В Японии создан 512-ядерный процессор


4-1152563763
incm
2006-07-11 00:36
2006.11.26
Как читать из файла открытого другой прогой на запись


2-1163004517
Greenchel
2006-11-08 19:48
2006.11.26
Вопрос о TEdit


15-1162903593
Juice
2006-11-07 15:46
2006.11.26
Автоматическая установка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский