1 <?xml version="1.0" encoding="UTF-8"?>
3 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4 * Copyright (C) 2008 - INRIA
7 * Copyright (C) 2012 - 2016 - Scilab Enterprises
9 * This file is hereby licensed under the terms of the GNU GPL v2.0,
10 * pursuant to article 5.3.4 of the CeCILL v.2.1.
11 * This file was originally licensed under the terms of the CeCILL v2.1,
12 * and continues to be available under such terms.
13 * For more information, see the COPYING file which you should have received
14 * along with this program.
17 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="save_format" xml:lang="ru">
19 <refname>save format</refname>
20 <refpurpose>формат файлов, полученных с помощью функции "save"</refpurpose>
23 <title>Аннотация</title>
25 Целью данного документа является определения формата HDF5,
26 используемого Scilab'ом для хранения своих данных.
29 Этот формат называется SOD от английского Scilab Open Data
30 ("открытые данные Scilab'а").
33 Первый публичный релиз SOD был сделан в Scilab 5.4.0.
37 <title>Основная причина</title>
39 Интероперабельность является одним из ключевых аспектов
40 современного программного обеспечения. Для того, чтобы
41 больше и больше улучшать этот аспект был предложено
42 стандартное определение формата HDF5.
45 Со времён Scilab 5.2.0 была разработана возможность
46 экспорта/импорта, которая используется для обмена данными.
47 Это уже один из основных компонентов Xcos для хранения и
52 <title>Поддерживаемые типы данных</title>
54 Поддерживаются все типы данных Scilab'а. Например:
56 <informaltable border="1">
60 <emphasis role="bold">Имя</emphasis>
63 <emphasis role="bold">Пример в Scilab'е</emphasis>
68 <emphasis role="bold">double</emphasis>
79 <emphasis role="bold">string</emphasis>
83 b=["string 1";"my string 2"];
88 <emphasis role="bold">boolean</emphasis>
97 <emphasis role="bold">integer</emphasis>
101 int8([1 -120 127 312])
102 x=int32(-200:100:400)
108 <emphasis role="bold">polynomial</emphasis>
119 <emphasis role="bold">sparse</emphasis>
123 sp=sparse([1,2;4,5;3,10],[1,2,3])
129 <emphasis role="bold">boolean sparse</emphasis>
133 dense=[%F, %F, %T, %F, %F
143 <emphasis role="bold">list</emphasis>
147 l = list(1,["a" "b"])
153 <emphasis role="bold">tlist</emphasis>
157 t = tlist(["listtype","field1","field2"], [], []);
163 <emphasis role="bold">mlist</emphasis>
167 M=mlist(['V','name','value'],['a','b';'c' 'd'],[1 2; 3 4]);
174 Несколько "типов" основаны на <emphasis>tlist</emphasis> или
175 <emphasis>mlist</emphasis>. Это <emphasis>rational</emphasis>,
176 <emphasis>state-space</emphasis>,
177 <emphasis>cell</emphasis> и <emphasis>struct</emphasis>.
178 Следовательно, они явно сохраняются.
181 <emphasis>void</emphasis> и <emphasis>undefined</emphasis> -
182 это два особых элемента, созданных для управления особыми
183 случаями в управлении списками. Они описаны ниже.
187 <title>Структура файла HDF5</title>
189 Архитектура HDF5 Scilab'а довольно проста.
191 <emphasis role="bold">Основные сведения</emphasis>
193 Для каждой переменной Scilab'а декларируется набор данных в
194 корне. Имя набора данных - это имя переменной Scilab'а.
197 Например, следующий код:
200 emptyuint32matrix = uint32([]);
201 uint32scalar = uint32(1);
202 uint32rowvector = uint32([1 4 7]);
203 uint32colvector = uint32([1;4;7]);
204 uint32matrix = uint32([1 4 7;9 6 3]);
205 save("uint32.sod","emptyuint32matrix","uint32scalar","uint32rowvector","uint32colvector","uint32matrix");
207 <para>формирует:</para>
210 <imagedata fileref="../images/img001.png" width="5.95cm" depth="1.64cm"/>
214 Каждый корневой набор данных имеет атрибут, именуемый
215 <literal>SCILAB_Class</literal>. Этот атрибут определяет
216 какие типы переменных хранятся в HDF5-файле.
219 Если переменная является основным типом и без связанных с
220 ним комплексных значений, то данные сохраняются
221 непосредственно в набор данных. В противном случае, набор
222 данных содержит ссылки на фактические данные.
225 Каждый SOD-файл содержит две особые переменные:
230 <literal>SCILAB_scilab_version</literal> - описывает
231 какая версия Scilab'а использовалась для сохранения
235 Например, для Scilab 5.4.0 эти данные будут иметь вид:
238 <emphasis>SCILAB_scilab_version = scilab-5.4.0</emphasis>
243 <literal>SCILAB_sod_version</literal> - описывает
244 какая версия спецификации SOD использовалась для
248 Например, для Scilab 5.4.0 эти данные будут иметь вид:
251 <emphasis>SCILAB_sod_version = 2</emphasis>
256 Типы, данные которых сохраняются непосредственно в набор
259 <informaltable border="1">
263 <emphasis role="bold">Тип Scilab'а</emphasis>
266 <emphasis role="bold">Атрибут HDF5 типа Scilab'а</emphasis>
269 <emphasis role="bold">Атрибуты HDF5</emphasis>
272 <emphasis role="bold">Расположение типов данных HDF</emphasis>
280 <para>SCILAB_Class = string</para>
286 <para>строковое значение</para>
293 <td namest="c2" nameend="c3" align="left">
294 <para>SCILAB_Class = boolean</para>
300 <para>32-битное целое число</para>
307 <td namest="c2" nameend="c3" align="left">
308 <para>SCILAB_Class = integer</para>
311 <para>SCILAB_precision = {8, 16, 32, u8, u16, u32}</para>
313 <td namest="c1" nameend="c2" align="left">
314 <para>8 = 8-битный символ</para>
315 <para>16 = 16-битное целое число</para>
316 <para>32 = 32-битное целое число</para>
317 <para>u8 = 8-битное целое беззнаковое число</para>
318 <para>u16 = 16-битное целое беззнаковое число</para>
319 <para>u32 = 32-битное целое беззнаковое число</para>
325 Для этих типов, как в Scilab'е, данные хранятся в одномерном
326 массиве. Данные сохраняются столбец на столбцом.
329 Для восстановления матрицы, вектора или скаляра, два
330 атрибута дают количество столбцов и строк.
333 Начиная с релиза 5.4.0 Scilab'а и SOD v2, <literal>SCILAB_cols</literal> и
334 <literal>SCILAB_rows</literal> больше не используются для
335 матриц типа double, integer, polynomial и string. SOD
336 использует родную многомерную возможность HDF5.
339 <emphasis role="bold">Пример</emphasis>
342 Сохранение декларации: <code>int32([1 -4 7;-9 6 -3])</code>
343 будет отображено как:
347 <imagedata fileref="../images/img002.png" width="5.95cm" depth="1.64cm"/>
350 <para>в hdfview.</para>
351 <para>А метаданные будут отображены как:</para>
352 <emphasis role="italic">
353 <para>int32matrix (800, 2)</para>
354 <para>32-bit integer, 3 x 2 => размер переменной</para>
355 <para>Number of attributes = 2</para>
356 <para>SCILAB_Class = integer</para>
357 <para>SCILAB_precision = 32</para>
361 Скалярное значение хранится в виде матрицы размером 1 на 1.
365 Пустая переменная (<literal>[]</literal>) будет иметь
366 атрибут <literal>SCILAB_empty</literal>, установленный в
370 <emphasis role="bold">Типы, в которых данные хранятся в
371 соответствующей группе
375 Многие типы данных Scilab'а хранятся с помощью групп. Это
376 позволяет не только явно разделять значения, но и иметь
380 Группы именуются по переменным, заключённым в знак "#".
381 Например, для матрицы значений типа double, названной
382 matrixofdouble, имя корневого набора данных будет
383 matrixofdouble, имя связанной с ней группы будет <emphasis
384 role="strong">#matrixofdouble#</emphasis>.
387 Для рекурсивного типа данных (list, mlist, tlist и т. д.)
388 имена подгрупп построены следующим образом:
391 Знак <literal>#</literal> позволяет создавать уникальный
392 идентификатор. Количество начальных знаков
393 <literal>#</literal> показывает уровень глубины.
394 Следовательно подсписок
395 <emphasis>###listnested#_#2##_#1##</emphasis> будет
396 указывать, что он помещён на второй уровень.
399 Символ подчёркивания "_" является способом представить
400 глубину. Обычно в таких случаях используется символ "/", но
401 это зарезервированное ключевое слово в спецификации HDF5.
404 Целые числа, используемые в названии, показывают положение в
405 структуре данных, оба в терминах положения в текущей
406 структуре, но также относительно родительского элемента. В
407 примере <emphasis>###listnested#_#2##_#1##</emphasis>, 1
408 показывает, что мы имеем дело со вторым элементом третьей
409 структуры главного элемента (элементы индексируются начиная
413 В следующем примере, группа, названная
414 <emphasis>###listnested#_#2##_#1##</emphasis>,
415 будет указывать на значение [32, 42]:
418 listnested=list(2,%i,'f',ones(3,3))
419 listnested(3) = list( %t, [32,42]);
422 <emphasis role="bold">Разрежённая матрица</emphasis>
425 <emphasis role="strong">Тип Scilab'а:</emphasis> sparse
428 <emphasis role="strong">атрибут HDF5 типа
431 SCILAB_Class = sparse
434 <emphasis role="strong">атрибуты HDF5: </emphasis>
436 <para>SCILAB_rows = <int></para>
437 <para>Количество строк</para>
439 <emphasis>SCILAB_cols = <int></emphasis>
441 <para>Количество столбцов</para>
443 <emphasis>SCILAB_items = <int></emphasis>
446 Определение количества элементов разрежённой матрице
449 <emphasis role="strong">Значения корневого набора данных:</emphasis>
452 Первое значение (<literal>#0#</literal>): каждый элемент из
453 этой структуры данных показывает количество ненулевых
454 элементов на строку. Следовательно, первый элемент
455 показывает количество элементов в первой строке разрежённой
459 Второе значение (<literal>#1#</literal>): указывает
460 положение столбца каждого элемента разрежённой матрицы.
463 Третье значение (<literal>#2#</literal>): хранит ссылку на
464 фактические значения элементов в разрежённой матрице (каждое
465 будет сохранено в особой группе).
467 <para>Например, взяв такую матрицу:</para>
468 <programlisting role="no-scilab-exec">
469 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.
470 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
471 0. 0. 0. 0. 0. 0. 0. 0. 0. 3.
472 0. 0. 0. 0. 2. 0. 0. 0. 0. 0.
474 <para>которая формируется функцией:</para>
475 <programlisting role="scilab_code">
476 sparse([1,2;4,5;3,10],[1,2,3])
482 <emphasis>#0#</emphasis> содержит <emphasis>1;0;1;1</emphasis>
485 <emphasis>#1#</emphasis> содержит <emphasis>2;10;5</emphasis>
488 <emphasis>#2#</emphasis> обращается к матрице чисел типа
489 double (в этом примере они не комплексные), которая содержит
490 <emphasis>1.0; 3.0; 2.0</emphasis>.
493 <emphasis role="bold">Разрежённая матрица логических значений</emphasis>
496 <emphasis role="strong">Тип Scilab'а:</emphasis> boolean sparse
499 <emphasis role="strong">атрибут HDF5 типа Scilab'а:</emphasis> SCILAB_Class = boolean sparse
502 <emphasis>атрибуты HDF5:</emphasis>
505 <emphasis>SCILAB_rows = <int></emphasis>
507 <para>Количество строк</para>
509 <emphasis>SCILAB_cols = <int></emphasis>
511 <para>Количество столбцов</para>
513 <emphasis>SCILAB_items = <int></emphasis>
516 Определение количества элементов в разрежённой матрице
519 <emphasis role="strong">Значения корневого набора
522 в то время как разрежённая матрица имеет
523 3 набора данных, разрежённая матрица логических значений
524 имеет только 2, поскольку определяемые значения
525 автоматически рассматриваются как истинные.
528 Первое значение (<literal>#0#</literal>): каждый элемент
529 этой структуры данных показывает количество ненулевых
533 Следовательно, первый элемент показывает количество
534 элементов в первой строке разрежённой матрицы.
537 Второе значение (<literal>#1#</literal>): указывает
538 положение столбца каждого из элементов разрежённой матрицы.
540 <para>В разрежённой матрице логических значений:</para>
542 dense=[%F, %F, %T, %F, %F
548 <emphasis>#0#</emphasis> содержит <emphasis>1;1;0;1</emphasis>.
551 <emphasis>#1#</emphasis> содержит <emphasis>3;1;5</emphasis>.
554 Для восстановления разрежённой матрицы логических значений
555 требуется только два значения.
558 <emphasis role="bold">Расположение типов данных
564 <emphasis role="bold">Числа удвоенной точности</emphasis>
567 <emphasis role="strong">Тип Scilab'а:</emphasis> double
570 <emphasis role="strong">атрибут HDF5 типа Scilab'а:</emphasis> SCILAB_Class = double
573 <emphasis role="strong">Значения корневого набора данных:</emphasis>
576 Как вещественные так и комплексные значения хранятся в
577 группе, именуемой <literal>#<имя переменной>#</literal>.
580 Первое значение: ссылка на вещественные значения. Названо
581 <literal>#0#</literal>.
584 Если матрица комплексная, то второе значение будет ссылаться
585 на комплексные значения. Названо <literal>#1#</literal>.
588 <emphasis role="bold">Расположение типов данных
591 64-битное с плавающей запятой
594 <emphasis role="bold">Полином</emphasis>
597 <emphasis role="strong">Тип Scilab'а:</emphasis> polynomial
600 <emphasis role="strong">атрибут HDF5 типа
603 SCILAB_Class = polynomial
606 <emphasis role="strong">атрибуты HDF5: </emphasis>
608 <para>SCILAB_Class = polynomial</para>
609 <para>SCILAB_varname = <string></para>
610 <para>Имя символьной переменной</para>
612 <emphasis>SCILAB_Complex = <boolean></emphasis>
615 Если полином комплексный (не устанавливается, если ложь).
618 <emphasis role="strong">Значения корневого набора
623 Коэффициенты хранятся в виде матрицы чисел удвоенной
624 точности (сравни соответствующий раздел, посвящённый
625 хранению чисел удвоенной точности). Интересно отметить, что
626 коэффициенты могут быть комплексными и, следовательно, могут
627 храниться в виде матрицы комплексных значений. Правила
628 наименования (под-)групп и набора данных описаны в начале
632 <emphasis role="bold">Расположение типов данных HDF</emphasis> ссылка на объект
635 <emphasis role="bold">Список</emphasis>
638 <emphasis role="strong">Тип Scilab'а:</emphasis> list
641 <emphasis role="strong">атрибут HDF5 типа Scilab'а:</emphasis>
643 <para>SCILAB_Class = list</para>
645 <emphasis role="strong">атрибуты HDF5:</emphasis>
646 SCILAB_items = <количество пунктов в списке>
649 <emphasis role="strong">Значения корневого набора данных:</emphasis>
652 Привязанные к корневому набору данных значения хранятся в
653 этом наборе и являются ссылками на значения, хранимые в
654 списке. Значения хранятся в группе, названной
655 <literal>#<имя переменной>#</literal>. В группе
656 <literal>#<имя переменной>#</literal> данные могут
657 быть любого типа. Они прямо включены в группу. Их
658 представления те же самые, что и в других случаях,
659 основанных на рекурсивной структуре (имеется в виду, что
660 можно сохранить и загрузить список списка списка различных
664 Правила наименования (под-)групп и набора данных описаны в
665 начале этого раздела.
668 <emphasis role="bold">Расположение типов данных HDF</emphasis> ссылка на объект
671 <emphasis role="bold">Типизированный список</emphasis>
674 <emphasis role="strong">Тип Scilab'а:</emphasis> tlist
677 <emphasis role="strong">атрибут HDF5 типа Scilab'а:</emphasis>
679 <para> SCILAB_Class = tlist</para>
681 <emphasis role="strong">атрибуты HDF5:</emphasis> см. список
684 <emphasis role="bold">матричноориентированный список</emphasis>
687 <emphasis role="strong">Тип Scilab'а:</emphasis> mlist
690 <emphasis role="strong">атрибут HDF5 типа Scilab'а:</emphasis>
692 <para>SCILAB_Class = mlist</para>
694 <emphasis role="strong">атрибуты HDF5:</emphasis> см. список
697 <emphasis role="bold">Пустое значение</emphasis>
700 <emphasis role="strong">Тип Scilab'а:</emphasis> void
703 <emphasis role="strong">атрибут HDF5 типа Scilab'а:</emphasis>
705 <para>SCILAB_Class = void</para>
707 Пустое значение можно найти только в очень особых случаях
708 использования списков, типизированных списков и
709 матричноориентированных списков. Оно может быть создано с
710 помощью следующего синтаксиса:
712 <programlisting>voidelement_ref=list(1,,3);</programlisting>
714 <emphasis role="bold">Неопределённое значение</emphasis>
717 <emphasis role="strong">Тип Scilab'а:</emphasis> undefined
720 <emphasis role="strong">атрибут HDF5 типа Scilab'а:</emphasis>
722 <para> SCILAB_Class = undefined</para>
724 Неопределённое значение формируется, когда размер списка
725 увеличивается, а некоторые элементы не определены. Они будут
726 сформированы с помощью следующего синтаксиса:
729 undefinedelement_ref=list(2,%i,'f',ones(3,3));
730 undefinedelement_ref(6)="toto"
734 <title>Примеры из жизни</title>
736 Файлы с образцами всех этих переменных прилагаются к
737 дистрибутиву Scilab'а. Они лежат в директории:
738 <emphasis>SCI/modules/hdf5/tests/sample_scilab_data/</emphasis>
741 На момент редактирования этого документа были приложены
744 <emphasis role="italic">
748 <para>booleanscalar.sod
750 <para>booleansparse.sod
752 <para>emptymatrix.sod
754 <para>emptysparse.sod
756 <para>hypermatrixcomplex.sod
758 <para>hypermatrix.sod
770 <para>matricedoublecomplexscalar.sod
772 <para>matricedoublecomplex.sod
774 <para>matricedoublescalar.sod
776 <para>matricedouble.sod
778 <para>matricestringscalar.sod
780 <para>matricestring.sod
784 <para>polynomialscoef.sod
786 <para>polynomials.sod
788 <para>sparsematrix.sod
798 <para>undefinedelement.sod
800 <para>voidelement.sod
805 <title>История развития формата</title>
806 <informaltable border="1">
810 <emphasis role="bold">Версия SOD</emphasis>
813 <emphasis role="bold">Версия Scilab'а</emphasis>
816 <emphasis role="bold">Описание</emphasis>
827 <para>Начальная версия формата Scilab/HDF5</para>
835 <para>5.4.0 alpha / beta</para>
839 Формат по умолчанию для загрузки и сохранения.
842 Предыдущий формат (.bin) по-прежнему поддерживается.
855 Для матриц значений тип double, integer, polynomial и string
856 <emphasis>SCILAB_cols</emphasis> / <emphasis>SCILAB_rows</emphasis> были
857 удалены, чтобы использовать многомерные HDF5.
866 <para>6.0.0 (будущая)</para>
869 <para>.bin не поддерживается.</para>
875 <refsection role="see also">
876 <title>Смотрите также</title>
877 <simplelist type="inline">
879 <link linkend="save">save</link>
882 <link linkend="load">load</link>
885 <link linkend="listvarinfile">listvarinfile</link>
888 <link linkend="type">type</link>
891 <link linkend="typeof">typeof</link>