Александр Кетков
Михаил Шульц
M A T L A B 7
ПРОГРАММИРОВАНИЕ,
ЧИСЛЕННЫЕ МЕТОДЫ
Санкт-Петербург
«БХВ-Петербург»
2005
УДК 681.3.06
ББК 32.973.26-018.2
К37
УДК 681.3.06
ББК 32.973.26-018.2
Предисловие 1
ПРИЛОЖЕНИЯ 705
Краткий обзор
Пакет MATLAB 7 — последняя версия одного из наиболее популярных про-
дуктов фирмы MathWorks, появившаяся на рынке программного обеспече-
ния в июне 2004 г. Его основное назначение — моделирование, анализ и
визуализация динамических процессов, имеющих отношение к разнообраз-
ным сферам человеческой деятельности.
Таблица 1.1
Пошаговые вычисления
в командном окне
2.1. Путешествие по среде MATLAB 7
По умолчанию после запуска пакета MATLAB 7 на экране появляется ком-
бинированное окно, включающее четыре наиболее важные панели — Com-
mand Window (Окно команд), Command History (История команд), Workspace
(Рабочее пространство) и Current Directory (Текущий каталог). Две послед-
ние панели закрывают друг друга, и для выдвижения нужной панели на пе-
редний план следует щелкнуть по соответствующей вкладке. Три окна, впи-
санные в главное окно системы (рис. 2.1), "поставлены на якоря". Они
передвигаются вместе с главным окном системы, вместе с ним изменяют
свои размеры, границы между окнами можно передвигать. Каждое из них
можно снять с якоря (кнопки Undock (Отстыковать) 1 3 . размешенные в
правых верхних углах окон), и тогда оно может занимать автономную пози-
цию на экране.
Вообще, самой используемой панелью является Command Window (Окно
команд). В ней набираются команды пользователя, подлежащие немедлен-
ному исполнению. Здесь же выдаются результаты выполненных команд.
В командном окне можно обратиться за помощью по поводу того или иного
термина с помощью одной из команд — doc, help или lookfor. Присутст-
вие двух других окон во время сеанса работы только загромождает экран, и
их целесообразно закрыть (такого рода операции выполняются не только
кнопками, но и командами меню Desktop (Рабочий стол)).
Окно Workspace (Рабочее пространство) отображает текущий набор пере-
менных, заведенных пользователем в командном окне. Здесь можно увидеть
их имена (колонка Name (Имя)), значения скалярных переменных (колонка
Value (Значение)) и тип представляемых данных (колонка Class (Тип дан-
ных)). Точно такую же информацию можно увидеть в командном окне по-
сле исполнения команды whos. Поэтому постоянное присутствие окна
Workspace (Рабочее пространство) на экране вряд ли оправдано. В него
14 Глава 2
kAMATLAB
File Edit Debug Desktop Window Help
Shortcuts \f} How to Add i>] What's New : . .
s=3in(0.5)
» c=cos (0.5)
5*S+C*C
ans =
1
5=sin(0.5)
c=cos (0.5)
s*s+c*c
Open... ; Ctrl+O
Clcse Command Window
Importbata... , ,
:
Save Workspace As.., Ctrl+S
Set Path..,
Preferences...
Page Setup.,.
Print... ."•• :•; • ' ••:'• ;;
1 C:\...p5\work\array2vec.rn
2 H:\,..AB7\work\untitled.m
3 C:\MATLAB6p5\wcrk\diff2.m
4 C:\MATLAB6p5\workl\test.rn
Exit MATLAB Ctrl+Q
Undo Ctrl+Z
Сору Alt+W
Paste Ctrl+Y
Paste Special...
Select All
Delete • Ctrl+D
Find...
; Find Files...
Clear Command Window
Clear Command History
Clear Workspace
Desktop
» Undock Command Window Default : -'•-:• ; ;;
Desktop Layout Command Window Only
Save Layout... History and Command Window
Organize Layouts... All Tabbed:. ;
«• Command Window
<f Command History ..•..;
•• Current Directory
«"Workspace
Help
Profiler
'Toolbar
•• Shortcuts Toolbar
«•Titles. ' • ' •• • '.' :.
Рис. 2.4. Команды меню Desktop
-j=.MATLAB
File Edit Debug Desktop Window Help
D GJF ! i. -Si Ш •-': CJ : % Of : f \ Current Directory | H:WA
I TLAB7\work
Command Window
» s=sin(0.5);
» c=cos (D.5) ;
» S*S+C*C
ans =
1
Command Wn
idow [Command Hs
i tory j Current Driectory | Workspace [ Hep
l | Profiler j
Undo
r Redo
1 MATLAB
File Edit Debug desktop Window Help
>r
D Or I « Ч-я Ш > "• ' Щ tf | f 1 ; Current Directory | H:WATLABT\work Ё?
1 L
L
L -Paste
Copy
L
L
GUIDE
Help Browse for folder
Go up one level
Cut Simulink
u
Open file
New M-File
дующих, используя условный знак переноса в виде трех подряд идущих то-
чек ( . . . ) . Вслед за знаком переноса необходимо нажимать клавишу
<Enter>.
— New variable
Open selection
должение в следующей строке, являются три подряд идущих точки. Все, что
располагается в этой же строке правее знака переноса, MATLAB 7 воспри-
нимает как комментарий:
» x=sin(0.2)*cos(0.5)+ sin(0.5)*cos(0.2)...формула будет продолжена
+cos(0.2)*cos(0.5)-sin(0.2)*sin(0.5) % продолжение предыдущей строки
х =
1.4091
» х=1;
» У=2;
» z=3;
» whos
Name BytesSize Class
X 8lxl double array
У lxl 8 double array
z lxl 8 double array
Grand total is 3 elements using 24 bytes
» clear x у
» whos
Name Size Bytes Class
z lxl 8 double array
Grand total is 1 elements using 8 bytes
» х=1;
» у=2;
22 Глава 2
» z=3;
» clear x,y, z
У =
2
z =
3
» whos
Name Size Bytes Class
У lxl 8 double array
z lxl 8 double array
Grand total is 2 elements using 16 bytes
1
Традиционно в математической литературе обозначение 1x1 (или, в общем случае,
тх.п) соответствует размеру матрицы, а размерность при этом равна 2. Однако в этом
издании указанное обозначение трактуется в понимании авторов. — Ред.
Пошаговые вычисления в командном окне 23_
2 Зак. 899
24_ Глава 2
» a=['abcdefghijk';'ABCDEFGHIJK';'1234567890']
??? Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.
» a=['abcdefghijk';'ABCDEFGHIJK1;'1234567890 ']
a =
abcdefghijk
ABCDEFGHIJK
1234567890
>> whos
Name Size Bytes Class
a 3x11 66 char array
Grand total is 33 elements using 66 bytes
» а=[]
» b=char([ ]
b =
» c=uint8 ( [
с =
Пошаговые вычисления в командном окне 25
» whos
Name Size Bytes Class
а 0x0 0 double a r r a y
b 0x0 0 char array
с 0x0 0 uint8 array
Grand total is 0 elements using 0 bytes
Таблица 2.1
Пример отображения Пример отображения Пример отображения
числа числа числа
» х=123456789 » х=10/6 » х=1/1000
х = х = х =
123456789 1.6667 0.0010
» х=1234567890 » х=100/6 » х=1/10000
х = х = х =
1.2346е+009 16.6667 1.0000е-004
26 Глава 2
X = х =
Таблица 2.2
х= X =
1.4142 1.4142e+000
» format long » format long e
» X » X
! 1.41421356237310 1.414213562373095e+000
» format rational
! » x
x=
j 1393/985
Ujt. Preferences
SGeneral Command Window Preferences
m
IB-fonts
| г Text display
: Accessibility | rational
Г Arrow keys navigate instead of recalling history
O K C a n c e l A p p l y H e l p
Рис. 2.9. Выбор формата для вывода числовых данных в командном окне
» format short g
» x=sqrt(2)
x =
1.4142
» x=sqrt(2000000)
x =
1414.2
28_ Глава 2
» x=sqrt(2e+20)
х=
1.4142е+010
1000.00
Формат + обеспечивает вывод только знаков чисел, сами значения при этом
не выводятся:
» format +
» х=[-1 2 - 3 4 -5] ;
» х
х=
» eps
ans =
2.2204 4 604 9250313e-016
» reaimin
ans =
2.225073858507201е-308
» reaimax
ans =
1.797693134862316e+308
» pi
ans =
3.14159265358979
х=
1
a 2 2 x 2 + a 2 3 x 3 = b2; (2.1)
= Ьз.
a=zeros(5)
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
с .0 0 0 .0
b=zeros(3, 4)
b =
0 0 0 0
0 0 0 с
0 0 0 0
c=ones([2 3])
1 1 1
1 1 1
d=eye(4)
d =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
e=rand(4)
f =
-0.4326 -1.1465 0.3273 -0.5883
-1.6656 1.1909 0.1746 2.1832
0.1253 1.1892 -0.1867 -0.1364
0.2877 -0.0376 0.7258 0.1139
g=[e;f]
g=
0.9501 0.8913 0.8214 0.9218
0.2311 0.7621 0.4447 0.7382
0.6068 0.4565 0.6154 0.1763
0.4860 0.0185 0.7919 0.4057
-0.4326 -1.1465 0.3273 -0.5883
-1.6656 1.1909 0.1746 2.1832
0.1253 1.1892 -0.1867 -0.1364
0.2877 -0.0376 0.7258 0.1139
» х=[0:0.2:1]
х=
0 0.2000 0.4000 0.6000 0.8000 1.0000
» y=sin(x)
Пошаговые вычисления в командном окне 37
У =
О 0.1987 0.3894 0.5646 0.7174 0.8415
Таблица 2.3
Логические операции
& Логическое умножение скаляров;
логическое покомпонентное умножение массивов
одинаковой размерности;
логическое умножение массива на скаляр
I Логическое сложение скаляров;
логическое покомпонентное сложение массивов одинаковой размерности;
логическое сложение массива со скаляром
Логическое отрицание скаляра или всех элементов массива
Операции отношения
Проверка на равенство
Проверка на неравенство
> Проверка на "больше"
>= Проверка на "больше или равно"
< Проверка на "меньше"
<= Проверка на "меньше или равно"
Таблица 2.4
Таблица 2.5
Для функций gcd (от англ. greatest common divisor — наибольший общий де-
литель) и km (от англ. least common multiple — наименьшее общее кратное)
приведем очевидные результаты их работы:
gcd(100,25) = 25
lcm(100,25) = 100
Таблица 2.6
Результат ра- Результат работы Результат работы Результат работы
боты функции функции функции функции
mod(7,5)= 2 mod(-7,5) = 3 mod(7,-5) = -3 mod(-7,-5) = -2
rem(7, 5)= 2 rem(-7,5) = -2 rem(7,-5) = 2 rem(-7,-5) = -2
42 Глава 2
ans =
АВ
АС
ВС
•^ Figure 1
File Edit View Insert Tools Desktop Window Help
:
D'.'B? a "a \\ | Д <M"> © i se'T'D Ш'Г'в'й
35
..•: °-
I
\
03 I
0.25 1
U-Jt
:•• • : • .
0 . 1 5 \
i \
0 . 1
j
0 . 0 5
\ ^
. . . 0
1 f i l l
- 0 . 0 5
» xl=0:0.2:6.28;
>> y l = s i n ( x l ) ;
Пошаговые вычисления в командном окне 45
» y2=cos(xl);
» plot(xl,yl,xl,y2)
• •'•>
у
' •';""•• 4'
I
-1 \\\ 1
/\\\ /
/
0.5
/
I \ \\ /1 i1 i
\\ \ / j
g
-0.5
\ v/4\. /
"1
-1 J 1 23 56 7
Рис. 2.11. Совместное отображение графиков
двух функций в одном окне
Таблица 2.7
ИЛИ
» p l o t (х, у, ' : д ' )
Тип маркера задается еще одним символом в этой же управляющей строке.
Всего таких символов — 13, и соответствующие им маркеры приведены в
табл. 2.8.
Таблица 2.8
» х=[1 2 3 4 ] ;
» у=[1 2 2 4] ;
» p l o t (х, у, ' s — ' )
» х=0:0.2:6.28;
» yl=sin(x);
» y2=cos(x);
» plot(x,yl,'-\х,у2, ' .')
» legend('sin', 'cos', 4)
» ylabel('y-axis')
48 Глава 2
» xlabel('x-axis')
» grid on
» title('Function sin & cos''
7^ ч, 4
/ \ т
0.5 /
. *
(Л \
'Я : П
га и
•••. > • > . • ...
\ 1
1
- 0 . 5
\
in \
OS * J
.:•:,:.": • ч : Р ч • 1 , . 2
3 4 5 6 7
• • • • • , • . :
x-axs
i
Рис. 2.13. График функций с подписями, легендой и сеткой
» х=0:0.1:6.28;
» yl=sin(x);
» y2=sin(x)+cos (x);
» plotyy(x,yl,x,y2)
Первые два аргумента задают количество рядов (row) и колонок (col). Тре-
тий параметр (cur) объявляет порядковый номер подобласти, в котором
очередная функция plot будет строить свой график (рис. 2.15).
x=0:0.2:2*pi;
yl=sin(x);
y2=cos(x);
y3=yl.*exp(-x);
y4=yl.*у2;
50 Глава 2
» subplot(2,2,1);plot(x,yl);
» subplot(2,2,2);plot(x,y2);
» subplot(2,2,3) ,-plot(x,y3);
» subplot(2,2,4);plot(x,y4);
» phi=0:0.1:2*pi;
» ro=5*(1+cos(phi));
» polar(phi,ro)
» title('Кардиоида')
: Кардиоида
90 1 0
120
30
- - ) — , — j- — -t —I О
240
270
2.6.3. Использование
логарифмического масштаба
Единицы измерения значений ординат и абсцисс далеко не всегда соответ-
ствуют друг другу, и для создания более обозримого графика вдоль одной
или обеих координатных осей приходится выбирать логарифмический мас-
штаб. Для построения таких графиков используются функции loglog
(логарифмический масштаб по обеим осям), semilogx (логарифмический
масштаб по оси х), semiiogy (логарифмический масштаб по оси у) — при-
мер 2.20, рис. 2.17.
100
Л 10
50
0.5
5 1
1
0 А" >/
1 Г"
i 1 i
-5 •
%% Create figure
figurel = figure('PaperPosition1, [0.6345 6.345 20.3 15.23], ...
'PaperSize', [20.98 29.68]);
%% Create axes
axesl = axes(...
'YColor1, [0 0 1], . . .
58 Глава 2
%% Create plot
plotl = plot(xl,yl,'Parent',axesl);
%% Create axes
axes2 = axes (. . .
'YColor',[0 0.5 0], . . .
'YAxisLocation','right',...
'YTick', [-2 -1 0 1 2]., . . .
'Parent',figurel);
axis(axes2,[0 7 -2 2 ] ) ;
hold(axes2,'all');
%% Create plot
plot2 = plot(xl,y2,'Parent',axes2);
Help.. OK Cancel
Help.. OK Cancel
указать цвет окаймления поля графика (Figure Color), включить или отклю-
чить воспроизведение порядкового номера графического окна (Show Figure
Number). С помощью кнопки Inspector (Инспектор) вызывается Property
Inspector (Инспектор свойств), в котором отображаются все свойства фигу-
ры. Любое из них, не включенное в наиболее употребительный набор, тоже
может быть изменено. Более подробная информация о свойствах всех гра-
фических компонентов и технике работы с Property Inspector (Инспектор
свойств) приводится в гл. 7 и 8.
Из окна Property Editor (Редактор свойств) можно вызвать диалоговое окно
Export Setup (Параметры экспорта).
-/ Figure 1 U5ra
File Edit View Insert Tools Desktop Window Help
rJtfTg фЩ\ C<3lW® | S Ш SI ° •
• .-»•" ~S -t В •
—я
/ \\
0.5 \
/ \ \\ '''
0i \ \
\ \
\ /
/
\ /
0.5 4 \
/
/
A
-1I S 1 u_ _j js 1 —•
0 1
Property Editor - Axes
Title: X Axis у Axis Z Axis j Font | Inspector..
X Label: | Ticks... 1
Colors: g • JL- X Limits: |o" to 7 Г" Auto
Grid: Г X Г У Г1
X Scale; |u... jJ Г" Reverse
Г Box
Выделение той или иной кривой (рис. 2.27) приводит к перенастройке ре-
дактора свойств на параметры указанного графика (Property Editor — Line-
series). Раскрывающиеся списки X/Y/Z Label Data Source (Источник дан-
ных) позволяют изменить значения векторов х, у и z, задающих табличную
Пошаговые вычисления в командном окне 63
С Manual Г Manual
Г Step by:
Locations: L a b e l s :
0 0
I n s e r t
1 1
2 2 . . _ 1 Delete
3 3
I *_ 4
5
6 G
_ .„Л. 7
: :
' ' . . . ' ' , ' . . . • . ' > '. : ' • • : ; • ; . . • • . • • .
OK Apply Cancel
U> Figure 1
File Edit View insert Tools Desktop Window Help
\
- • / • - ,
Jtll / •
I \
• i
\
/ i
/ •
0 •
•
05 / j
л •
0 :• 1 2 3 4 5 6 7
Property Editor - Lmeseries
Display Name: Plot Type: Line
:
X Data Source.' ] auto J^J |—— 1 i —i
Y Data Source: UnK | zj |05 j j
Matter | no... j j . 16Л zi :
t£'\
1 Data Source:
Команды Edit | Axes Properties (Правка Свойства осей) и Edit | Current Ob-
ject Properties (Правка| Свойства объекта) вызывают Property Editor (Редак-
тор свойств) с одновременной настройкой на параметры соответствующего
объекта.
Команда Edit | Find Files (Правка | Найти файлы) появилась только в
MATLAB 7. Она позволяет устроить поиск заданного контекста во всех
файлах текущего каталога. Аналогичным инструментом обладают практиче-
ски все оболочки операционных систем и достаточно развитые системы
программирования.
Команды последней группы обеспечивают очистку поля фигуры, команд-
ного окна, окна истории команд и рабочего пространства. По умолчанию
очистка трех последних компонентов сопровождается запросом подтвержде-
ния на выполнение операции.
Пошаговые вычисления в командном окне 65
Color
Z Dat Source:
- MarkerEdgeColor
L
MarkerFaceColor
LineWidth
L
MarkerSize
:
v
Bar
'-
\
Area
W/
Stairs
.SiS
e
tm
Рис. 2 . 2 9 . Способы отображения табличных функций
- New Figure
- Open File -Pan
- Save Figure - Rotate 3D .
r- Print Figure r-Data Cursor
•jk F i g u r e 1
[tile I Edit [view Insert TpoljT-Desktop'Window Help
.+ . I — I I—„ 7 .. I I— — ^ 4 ~— - • . ~r .
D c ^ H ^ I fe I ^ ^ О ® i ^S !• Q 13 j ш •
"-Ч
•
Zoom Out Show Plot Tools
L L
Zoom In Hide Plot Tools
L
• Edit Plot Insert Legend
L
Insert Colorbar
•/ Figure I
File Edit View Insert Tools Desktop: Window Help
о & a m\ i*~ « t ' C f ) ] ® ; к i а "и '•••••и
•JP" F i g u r e I
File Edit View Insert Tools Desktop Window Help
1
0.8
0.6 X: 24
Y: 0 6755
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
Меню View
Команды меню View (Вид) позволяют отобразить (команда помечена га-
лочкой) на экране или скрыть следующие средства редактирования (см.
рис. 2.21):
• Figure Toolbar — панель инструментов графического окна;
• Camera Toolbar — панель инструментов для управления камерой;
68 Глава 2
•Л Figure 1
File Edit View Insert Jpols Desktop Window Help
О i* В в]Л*|'®L Q.J5 .® ! ^ P. Ш! D n
Camera Toolbar [
* i л к / i H- •? ?J \ \ \ ^ T Q G | - f i 4 [Plot Edit Toolbar
(Figure P. Plot Browser
"*• New Subpo
l ts A 1
Axes (no title)
О 2D Axes ffl*"" 0.8
Ц^, 3D Axes EH
0.6
• Variables 0.4
EB* ix63
0,2
Щу 1X63
0
• Armotetions
-0.2
\Lina
^ Arrow -0.4
^ Double Arrow
-0.6
^ ^ Text Arrow
: -0.8
T Text Box
i >
• Rectangle '~ -1
О Ellipse !
Меню Insert
Меню Insert (Вставка) — см. рис. 2.21 — содержит набор команд по вставке
в графическое окно различных элементов оформления — легенды (Legend),
разноцветной полоски (Colorbar), линии (Line), различных стрелок (Arrow,
Double Arrow, Text Arrow), пояснительной подписи (Text Box), прямоуголь-
ников (Rectangle) и эллипсов (Ellipse). Все эти команды дублируют возмож-
ности Figure Palette (Редактор графического окна) и Plot Edit Toolbar
(Панель инструментов редактирования графика). Команда Insert | Light
(Вставка | Свет) подключает к графическому окну Property Editor (Редактор
свойств) источника света (Property Editor — Light), с помощью которого
можно изменить позицию (Position — х, у, г), стиль (Style) распространения
лучей света (бесконечно удаленный — Infinite, локальный — Local) и цвет
лучей (Color).
Меню Tools
Значительно расширен по сравнению с предыдущими версиями набор
команд меню Tools (Сервис) — см. рис. 2.21. Команды Edit Plot (Редакти-
ровать график), Zoom In (Увеличить масштаб), Zoom Out (Уменьшить мас-
штаб), Pan (Захватить), Rotate 3D (ЗО-поворот) и Data Cursor (Данные под
курсором) продублированы аналогичными кнопками на панели инструмен-
тов Figure Toolbar (Панель графического объекта). Команда Reset View
(Восстановить вид) возвращает на исходное место график, перемешенный в
режиме Pan (Захватить). Команда Options (Параметры) открывает список
команд (рис. 2.34), с помощью которых можно изменить режим масштаби-
рования, траекторию перемещения графика, захваченного в режиме Pan
(Захватить), и способ отображения координат точки, выделенной курсором:
• Unconstrained Zoom, Unconstrained Pan — естественное масштабирование
(одновременно по всем координатам) или естественное перемещение
графика (по траектории движения мыши);
• Horizontal Zoom, Horizontal Pan — масштабирование или перемещение по
горизонтали;
• Vertical Zoom, Vertical Pan — масштабирование или перемещение по вер-
тикали;
П Display Cursor as Datatip — значения координат точки, находящейся под
курсором, отображаются рядом с курсором;
П Display Cursor in Window — координаты помеченной точки отображаются
под полем графика.
Для удаления неудачно оцифрованной точки можно прибегнуть к услугам
всплывающего меню (рис. 2.35). Кроме удаления только что сделанной по-
метки (Delete Current Datatip), можно удалить все метки (Delete All Datatip),
70 Глава 2
» Unconstrained Zoom
Horizontal Zoom
Vertical Zoom
* Unconstrained Pan
Horizontal Pan \
Vertical Pan
•> Display Cirsor as Datatip— 4-\ X
Y:-0.3
0.52837
Display Cursor in Window - •
-0.2 \
-0.4 \
\
-0.6
-0.8
Display Style
Create New Datatip Alt-Click
Delete Current Datatip Delete
Delete All Datatips
Mouse Position
* Snap to Nearest Data Vertex
» х=[0:0.8:6.28];
» y=sin(x);
» plot(х,у)
0.4
Save to workspace. 0.2
0
-0.2
-0.4
-0.6
-0.8
-1
1 2
UJkBasic
See
l ct data: jdatai File Edit View Insert Tools Desktop Window Help
Г Center and scale X data D caTo a iЦГ| ®> Q. f? ©, w а Ш а о ^
Plot f i t s — — - -—
• Check to display fits on figurB 1
• W spline interpolant
:
] P shape-preserving interpolant
datai
• \Г linear spline
', I P quadratic
\ Г" cubic
• Г" 4th degree polynomial
! Г" 5th degree polynomial
• f~* 6th degree polynomial
; Г" 7th degree polynomial
j 1Г" 8th degree polynomial
;
1Г" 9th degree polynomial
j |j 10th degree polynomial
i Г" Show equations .. .
I Significant digits: j 2 J^j
::
! Г™ Ptot residuals •
г Insert Line
- Font - Insert Arrow
- Bold Insert Double Arrow
г Italic г Insert Text Arrow
-/ Figuni 1
irsert Tools Desktop Wndow Help
Align/Distribute
Pin to axes
Insert Textbox
Insert Rectangle
Insert Ellips
Шрифт
.--Образец •
Hafiop символов:
Кириллический
•> Figure 1
File Edit View Insert Tools Desktop Window Help
h as у *: n a• •
w
' ' New Subpolts
-Ш Hello. MATLAB
L_- 3D Axes 0.5
Create tiled subplots j
•*• Variables
\ /
1x63 Ч j D
Ь63
0 0.5
1.11
\l-ine
\ Arrow
I I Rectangle
О Ellipse
0.5 0 0.5
•gk Figure I
File Edit View insert Tools Desktop Window yelp
*> Figure 1
File Edit View Insert Tools Desktop Window Help
о & а а;ри Ф. «a, f?. ®Г*Е 1 -p gjjlpv_~L;l
•Kapguouga"
" " "
15
Обращение к функциям bar (пример 2.24) или barh с двумя аргументами (х,
у) позволяет изменить маркировку оси х (рис. 2.45). Правда при этом требу-
Пошаговые вычисления в командном окне 79
» х=[-1.5,0,2.5] ;
» у=[1,2,4];
>> bar(x,у);
>> colormap(cool)
'•• 3.5
3
2.5
1.5 —
0.5
» у=[1 2 4; 1.5 3 5]
У =
1.0000 2.0000 4.0000
1.5000 3.0000 5.0000
80 Глава 2
ИЛИ
» bar(y); colormap(cool)
Любая из приведенных выше строк генерирует две группы столбиков (рис. 2.46).
У= 15
2, ч
s
К
,-•
-
•
4.
4
т
Зч.
2,
1,
olj
J t l V I
N .
» q = [1,2,4];
>> colormap cool
» pie(q)
» pie3(q)
14%
S i к
1
57%
29% V
В?
» т= [ 1, 0, 0 ] ;
» pie3(q,m) % результат на рис. 2.55
: '••'• ••
» z=fl,249,1,249,1,249,1, 249] ;
» s={'Север','','Запад ','','Юг', " , ' Восток 1 , 1 1 };
>> pie(z,s); colormap(cool)
у =
» у=[1 8 3; 7 5 9 ; 4 2 6] ;
» yl=[l,7,4];
Пошаговые вычисления в командном окне 87
» у2=[8,5,2];
» уЗ=[3,9,6];
» subplot(2,2,1); plot(yl);grid on
» subplot(2,2,2); plot(y2);grid on
» subplot(2,2,3); plot(y3);grid on
» subplot(2,2,4); area(y); grid on; colormap(cool)
y1 = [1,7,4] = [8,5,2]
/ - • >
7
ч
1 1 6 I 25 3 1 1 5 2
2 5 3
25
20
" ^
15 4 > T
/ 10 _——~*
• — .
, - — — "
- — -
-.
• ~ • — - . ' ^
1 1.
5 2 2 . 5 3 1 1.5 2 2.5 3
= [ 3 . 9 . 6 ] у = [1.3.8; 7,5,9, 4, 2, Б]
4 Зак 899
Глава 3
Типы данных
3.1. Иерархия
типов данных в MATLAB
В справочных файлах приведена схема (рис. 3.1), на которой представлены
16 фундаментальных типов данных (или классов), определенных в MATLAB.
Из схемы явствует, что базовым классом данных является массив (ARRAY). На-
ряду с пустыми, неинициализированными массивами язык MATLAB позволя-
ет обрабатывать векторы (массивы размерности 1хл или лх1), квадратные и
прямоугольные матрицы (массивы размерности пхт), массивы более высокой
размерности.
ARRAY
function handle
» sm=['abcdefgh1;'12345678'
sm =
abcdefgh
12345678
>> whos
Типы данных 91_
» s v='abcde fgh';
» whos
Name Size Bytes Class
sv 1x8 16 char array
Grand total is 8 elements using 16 bytes
>> size(sv) % возвращает число строк и число столбцов
ans =
1 8
» length(sv) % возвращает количество символов
ans =
8
>> ndims(sv) % возвращает количество измерений
ans =
2
» sm=['abcdefgh1; '12345678 ']
sm =
abcdefgh
12345678
>> size(sm) % возвращает число строк и число столбцов
ans =
2 8
» length(sm) % возвращает количество символов в строке (!)
ans =
8
>> ndims(sm) % возвращает количество измерений
ans =
2
92 Глава 3
» x=intl6(12)
х=
12
» whos
Name Size Bytes Class
x lxl 2 intl6 array
Grand total is 1 elements using 2 bytes
» format hex
» x
X —
000с
>:> y=uintl6([5 25 30])
У =
0005 0019 OOie
>;> whos
Name Size Bytes Class
X lxl 2 intl6 array
У 1x3 6 uintl6 array
Grand total is 4 elements using 8 bytes
» int8(2.1)
ans =
2
» int8(2.5)
94 Глава 3
ans =
3
» int8(-2.5)
ans =
-3
» int (2.9)
ans =
3
х =
127
» int8([l 2 3 4 5])*0.8
ans =
1 2 2 3 4
» int8(10)/int8(100)*20.5
ans =
0
» 20.5*int8(10)/int8(100)
ans =
1
» 0.5+int8(10)/int8(120)
ans =
1
» 0.25+int8(10)/int8(100)+0.2S
ans =
0
Типы данных 97
Таблица 3.2
T_XOR =
0 1
1 О
» C=uint8(5);
>> bitcmp(C,6)
ans =
58
» bitset(С,2)
ans =
7
» bitset(C,3,0)
ans =
1
» bitget(C,3)
ans =
1
» bitget(C,2)
ans =
0
» bitshift(C,2)
ans =
20
» bitshift(C,-l)
ans =
2
» x=single(5)
5
» whos
Name Size Bytes Class
x lxl 4 single array
Grand total is 1 elements using 4 bytes
» abs(y)
ans =
1.1180
» y=single(5)+3
У=
8
» whos
100 Глава 3
» а=еуе(100);
» b=sparse(eye(100));
>> whos
Name Size Bytes Class
a 100x100 80000 double array
b 100x100 1604 sparse array
Grand total is 10100 elements using 81604 bytes
Иванов И. И. 31 11-11-11
Петров П. П. 32 22-22-22
Сидоров С. С. 33 33-33-33
102 Глава 3
» authors(3)=struct('Name','Сидоров С.С.','Age',33,...
'Phone','33-33-33');
» whos
Name Size Bytes Class
authors 1x3 440 struct array
Grand total is 28 elements using 440 bytes
» А = [ 2 3 4 5 6 7 8 9] ;
» isprime(А)
ans =
1 1 0 1 0 1 0 0
» who's
Name Size Bytes Class
A 1x8 64 double array
ans 1x8 8 logical array
Grand total is 16 elements using 72 bytes
» x=true(2)
X =
1 1
1 1
» y=true(2,3)
Типы данных 107
У =
1 1 1
1 1 1
» z=false( [2 3])
z =
0 0 0
0 0 0
» а=[5 6 ] ;
» v=false(a)
V =
-• 0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
Таблица 3.4
ABCDEF
» % Сочетание данных типа logical и double
» х = [true false false pi sqrt(7)]
Name: prhs[0]
Dimensions: 1x6
Class Name: char
(1,1) Привет
Name: prhs[0]
Dimensions: 0x0
Class Name: double
» a=[l 2 3 ] ; % вектор-строка
» explore(a)
Name: prhs[0]
Dimensions: 1x3
Class Name: double
(1.1) = 1
(1.2) = 2
(1.3) = 3
» a=[l;2;3]; % вектор-столбец
» explore(a) ;
Name: prhs[0]
Dimensions: 3x1
Class Name: double
110 Глава 3
(1,1) = 1
(2,1) = 2
(3,1) = 3
» а={1 2 3}; % массив ячеек
» explore(a);
Name: prhs[0]
Dimensions: 1x3
Class Name: cell
Dimensions: lxl
Class Name: double
(1,1) = 1
Cell Element: (1,2)
Dimensions: lxl
Class Name: double
(1,1) = 2
Cell Element: (1,3)
Dimensions: lxl
Class Name: double
(1,1) = 3
» explore 1 2 3
Name: prhs[0]
Dimensions: lxl
Class Name: char
(1,1) 1
Типы данных 111
Name: prhs[l]
Dimensions: lxl
Class Name: char
(1,1) 2
Name: prhs[2]
Dimensions: lxl
Class Name: char
(1,1) 3
» a=int8([1 2 3])
>> explore(a);
Name: prhs[0]
Dimensions: 1x3
Class Name: int8
(1.1) = 1
(1.2) = 2
(1.3) = 3
» a=sparse(eye(3)
>> explore(a);
Name: prhs[0]
Dimensions: 3x3
Class Name: sparse
(1.1) = 1
(2.2) = 1
(3.3) = 1
» explore(struct{'Name','Иванов И. И.','Age',31,'Phone', 41-11-11')
Name: prhs[0]
Dimensions: lxl
Class Name: struct
112 Глава 3
(1,1).Name
Dimensions: lxll
Class Name: char
(1,1) Иванов И. И.
(1,1)-Age
Dimensions: lxl
Class Name: double
(1,1) = 31
(1,1).Phone
Dimensions: 1x8
Class Name: char
(1,1) 11-11-11
» explored, 2, 3)
Name: prhs[0]
Dimensions: lxl
Class Name: double
(1,1) = 1
Name: prhs[1]
Dimensions: lxl
Class Name: double
(1,1) = 2
Name: prhs[2]
Dimensions: lxl
Class Name: double
(1,1) = 3
Типы данных 1_13_
» q{1,1}='Text'; % строка
» q{l,2}=3; % число типа double
>> q{l,3}=magic(2); % массив 2x2 типа double
» q{l,4}=l+i; % комплексное число
» q{l,5}=isreal(pi); % логическое значение
» q
q =
'Text' [3] [2x2 d o u b l e ] [1.0000+ l.OOOOi] [1]
» for j = l : 5 , a ( j ) = i s r e a l ( q { l , j } ) ; end
Типы данных 115
» а
а =
1 1 1 0 1
» iscell(q)
ans =
1
» iscellstr(q)
ans =
0
» a.fl='abc';
» a.f2=[0 1 2];
» a.f3=[Cabc'},{0,l,2}];
» a
fl: 'abc'
f2: [0 1 2 ]
f3: {'abc' [0] [1] [2]}
» isstruct(a)
ans =
1
Функция issparse(A) проверяет, является ли матрица А разреженной. Если
это так, то функция возвращает логическую истину.
С помощью функции isempty можно убедиться в том, что ее аргумент пред-
ставлен пустым массивом (пример 3.22).
» х=[];
>> isempty(х)
ans =
1
Типы данных 117
» х='а1Ь2сЗ';
» isletter(x)
ans =
1 0 1 0
» y=['al';'Ь2';'сЗ']
У=
al
Ь2
сЗ
118 Глава 3
» isletter(y)
ans =
1 О
1 О
1 О
» а=[1 2 3 4 5];
» issorted(а)
ans =
1
» Ь=[5 4 3 2 1];
» issorted(Ь)
ans =
О
» с='abc';
» issorted(с)
ans =
1
» d='bac';
» issorted(d)
ans =
0
» e=[l 2 3; 2 3 4]
Типы данных 119
е =
1 2 3
2 3 4
>> i s s o r t e d ( e , ' r o w s ' )
ans =
1
I value j Pass
[100,200] double
[1 2 3,4 5 6] double
Для размещения двух или более массивов поле редактора можно разбить
несколькими способами с помощью управляющих кнопок:
• Tile — в клетках матрицы;
• Left/Right Split — в вертикальных колонках;
5 Зак. 899
120 Глава 3
>> A=[l 2 3; 4 5 6] .- - _
— 7 ! 7
A= 81 8
1 2 3 9j 9
4 5 6 m, 10
11 ; 11
» B=[100 ;200]
12 ; I" 1
в=
100
> ЛИ JLJ
200 I
Окно с тем или иным массивом можно снять с якоря и перетащить на более
удобное место. В этом случае к окну автоматически приклеивается меню
(рис. 3.4). С помощью команды View | Numeric Array Format (Вид | Формат:
числовой массив) можно выбрать подходящий формат отображения число-
вых данных. Команды меню Desktop (Рабочий стол) позволяют вновь поста-
вить на якорь текущее окно или все окна-массивы, находящиеся в свобод-
ном плавании.
Типы данных 121
( ^Замечание }
С помощью Array Editor (Редактор массивов) можно изменять векторы или
матрицы. Массивы более высокой размерности в этом редакторе не обрабаты-
ваются.
_Ja|X!
File Edit |View. Graphics'Debug Desktop Window Help
Numeric Array Format > * short
-••, и . " i i i One short£
shortG
20
long
longE
longG
_ __ hex
bank
+• • :
rational
Программирование
вычислительных процессов
До сих пор мы использовали командное окно MATLAB в режиме диалога
пользователя с системой. Пользователь набирал в текущей строке очередную
команду и нажимал клавишу <Enter> — система выполняла соответствую-
щее действие и, при необходимости, выдавала результат этого действия. Все
набираемые команды повторялись в окне Command History (История
команд) и запоминались в специальном стеке, откуда могли извлекаться для
повторного выполнения ранее набранных действий или для формирования
похожих команд. Однако такой пошаговый режим хорош только для разо-
вого расчета. Даже повторение одной и той же вычислительной схемы с не-
большой модификацией алгоритма или с изменением исходных данных в
пошаговом режиме превращается в обременительное занятие.
k». MATLAB
File Edit Debug Desktop Window Help
Наконец, 5-я строка включена в текст программы только для того, чтобы
увидеть результат вычисления факториала. Конечно, в MATLAB имеются и
другие средства вывода результатов, но мы воспользовались простейшим
вариантом отображения значения переменной.
Программирование вычислительных процессов 125
120
писан так, как представлено в примере 4.1, и должен быть сохранен под
именем factn.m.
function y=factn(n)
k=l;
for(i=l:n)
k=k*i;
end
y=k;
pcode имя_т-файла
Программирование вычислительных процессов 127
Таблица 4.1
№ Формат оператора Пояснение
var = expr Оператор присваивания. Вычисляет значения вы-
ражения expr и заносит результаты вычислений в
переменную v a r
if условие_1 Условный оператор. Если справедливо усло-
операторы_1 вие_1, то выполняется группа операторы_1, если
справедливо условие_2, то выполняется группа
[elseif условие_2
операторы_2, ... Если все указанные условия ока-
операторы_2 зываются ложными, то выполняются операторы,
elseif условие_3 расположенные между e l s e и end
операторы_3
else
операторы ]
end
switch expr Переключатель по значению выражения expr.
case vail Если оно совпадает с величиной v a i l , то выпол-
няется группа операторы_1, если оно совпадает с
операторы_1
величиной v a l 2 , то выполняется группа операто-
case val2 ры_2, ... Если значение expr не совпадает ни с
операторы_2 одной из перечисленных величин, то выполняются
операторы, расположенные между o t h e r v i s e и
end
[ othervise
операторы]
end
for var=el:[e2:]e3 Цикл типа арифметической прогрессии, в котором
операторы переменная v a r при каждом повторении тела цик-
ла изменяется от начального значения e l с шагом
end
е2 до конечного значения еЗ
while условие Цикл с предусловием, повторяющийся до тех пор,
операторы пока истинно указанное условие
end
try Попытка выполнить группу операторы_1. При ус-
операторы_1 ловии, что в результате их выполнения возникает
исключительная ситуация, управление передается
catch
группе операторы_2 (обработка сбойных ситуа-
операторы 2 ций). Если ошибка не возникла, то группа опера-
end торы_2 не выполняется
break Досрочный выход из управляющих конструкций
типа f o r , w h i l e , s w i t c h , t r y - c a t c h
Программирование вычислительных процессов 129_
function
[yl,y2,...]=f4(xl,x2,
. . .)
g return Досрочный выход из тела функции
а=1;
for i=l:5
a=a*i;
end
a
inz = find(c);
if isempty(inz),
% All elements are zero
return
end
Очевидно, что описания функций такого типа имеют смысл при работе с
достаточно простыми формулами. Например, анонимная функция возведе-
ния в квадрат с указателем sqr может быть описана и использована сле-
дующим образом:
» sqr = @(х) х.Л2;
» s q r ( [ l 2 чЗ])
ans =
1 4 ' 9
C++, известно, что иногда функции могут иметь переменное число пара-
метров (список формальных аргументов в заголовке функции завершается
многоточием), и для создания такого рода программ используются специ-
альные средства — функции (точнее, макроопределения) va_start, vaend,
v a a r g , v a i i s t . Нечто похожее имеется и в языке MATLAB. Хотя пере-
менное число параметров, как входных, так и выходных для m-файлов, ско-
рее, является правилом, нежели исключением.
MATLAB упаковывает все входные параметры в массив ячеек с именем
varargin и запоминает количество передаваемых функции аргументов в
глобальной переменной nargin. Функция, возвращающая переменное число
значений, обычно начинается с заголовка:
function [varargout] = имя_функции(аргументы)
function polyline(varargin)
for k=l:length(varargin)
x(k)=varargin{k}(1);
у(k)=varargin{k}(2) ;
end
axis([min(x) max(x) min(y) max(y)])
plot (x,y)
[5] [6]
Программирование вычислительных процессов 141
q4 =
[7] [8]
q5 =
[9] [10]
» whos
Name Size Bytes Class
q3 =
q4 =
q5 =
9 10
» whos
Name Size Bytes Class
al 6x2 96 double array
Pi 1x2 16 double array
142 Глава 4
Р2 1x2 • 16 double a r r a y
qi 1x2 16 double a r r a y
q2 1x2 16 double a r r a y
q3 1x2 16 double a r r a y
q4 1x2 16 double a r r a y
q5 1x2 16 double a r r a y
function showdemo(demos)
errstring = 'Файла с таким именем в каталоге нет';
n = input('Выберите номер демонстрационного файла: ')
demos(n,:)
eval(demos(n,:),'[errstring demos(n,:)]')
O S
p
e
na
v
e L
L P nr
i
t LR uIt
n JL
E x
ti De
bu
g M od
Je
fe
N
e
wli Me-F
lU Red
o
indo C L S
e/ltc
aetp F
o
lat
- Se elrarBb
e
re
raa
kpo
no
kps
itnitn
iMAa
lxize
m F
ie
lis
Р и с . 4 . 4 . Панель инструментов редактора m-файлов
Программирование вычислительных процессов 147
ЩEditor I- |D|X
File Edit Text Cell Tools Debug Desktop Window Help ..II
ffl|f 6tQ
1 function [varargout] = array2vec(a)
2- for k=l:nargout
3 - varargout)к }=a (k,:);
4 - end
H:\MATLAB7\work\fern.ra
1 function fern
2 VFBRH MATLAB iwplementation of the Fractal Fern
.3 1 Michael Batnsley, Fractals Everywhere, Academic Press,199;
•4 i This version runs forever, or until stop is toggled.
5 ; % See also: FIHITEE'ERN.
6 - shg
7 - elf reset
8- set ( a c f , ' c o l o r ' , ' a h i t e ' , ' u r i i i u b a r * , ' n o n e ' , . . . Щ
array2vec.m * !|Jern.m x
Text|
Evaluate Selection1' F9
Wrap Selected Comments :•
: :
Comment Ctrl+R
: Uncomment Ctrl+T'
Deaease Indent Ctr(-+-£
Increase Indent Ctrl+]
: Smart Indent > Ctrl+1
Debug [_
•• Open M-Files when Debugging .•••••
Step FiO
Step 1П :: • .....;.: Fll .../..
Step Out Shift+Fll
Run ., : F5
Go Until Cursor
Set/Clear Breakpoint F12
Set/Modify Conditional Breakpoint..
: Enable/Disable Breakpoint •
; Clear Breakpoints in All Files
Step if Errors/Warnings...
Exit Debug Mode
alMATLAB Editor
Fle
i H;WATLAB7\worktarray2vec.m
Conditon for line 4 (for example, x>=» 1 f.
IS Stop if Errors/Warnin.
Errors ] TryC
l atch Errors Warnn
i gs | Man or Inf |
С Never stop if warning (dbclear if warning)
f Always stop if warning (cfbstop if warning)
P Use message Identifiers (dbstop It warning messageld)
Add Message Identifier Qj
Identifier: jMy Toolbox: FileNatFoundError
Example: My Toolbox: FileNotFoundError
; OK Cancel Help
И Editor - C:\MATLAB6p5\workl\calll.m
File Edit Text Cell Tools Debug Desktop Window Help
Ж]
Undo . ,/ :• Ctrl+Z
Redo Ctr.l+Y
Cut Ctrl+X
Copy Ctri+C
Paste' •,.'•• " : Ctrl+V
Paste Special,..
Select All Ctrl+A
Delete Delete
, Find and Replace.. Ctrl+F;T'
FindNext F3 ";
Find Previous Shift+F3
• Find Selection Ctrl+F3
Find Files....
Go To Line Ctrl+G.
Set/Cel ar Bookmark Ctrl+F2
Next Bookmark F.2
Prev Bookmark Shlft+F2
Cel ar Command Wn i dow
Clear Command History
Cel ar Workspace
Рис. 4 . 1 1 . Меню Edit
1 Go To L i n e E3|
Line number: | OK
;• . •: Cancel I
Ц E d i t o r - H:\MATLAB7\work\array2vec.m
File Edit Text Cell Tools Debug Desktop Window Help
Таблица 4.2
Клавиша/комбинация Операция
клавиш
Команда Назначение
2 for k=l:nargout
3 varargout{k}=a(k,:);
» dbstop in array2vec
% останов на первой выполняемой строке в файле array2vec.m
» dbstop if error
% переход в режим отладки, если будет обнаружена ошибка
» dbstop i f warning
% переход в режим отладки, если будет выдано предупреждение
» dbstop i f naninf
» dbstop i f infnan
% переход в режим отладки, если обнаружено NaN или °°
» dbclear all
% отмена всех установленных точек останова
» dbclear if error
» dbclear if warning
» dbclear if naninf '
% отмена заданных условий останова
\Щ E d i t o r :\MATLAB6p5\work\array2vec.m
File.Edit Text Cell Tools Debug Qesktop Window"Help
D & Ш I' X *» © ••" '-• i © i f t . / . : B i ; * ' t ill
1 function [varargout] = array2vec(a)
2 * foe k=l:nacgout
3* varargout(k)=a (k, :) ;
4 " end
-AMATLAB
File |dit Debjg Qesktop Window Help
D Ш | Щ 3 * I V j: Curreri Diectgrj;: | C:»MAILAB6p5\work ^
Editor - H:\MATLAB7\work\polyline.m
File Edit Text Cell Tools De^ug Desktop: Window Help
QSa i *««-<•* A I M / . Q f i • ;•>•> О
1 |f unction polyline(varargin)
2 •» for k=l: length (varargin)
3- x(k)=varargin(k) (1) ;
4- y(k) = v a r a r g i n ( k } (2) ;
5 * end
6- a x i s {[min (x) max(x) min(y) max (y) ])
" Plot(x,y)
7
T
;3: Array x T is constructed using subscripting.
messages
Consider preallocating for speed
T
4: Array y' is constructed using subscripting.
Consider preallocating for speed
4 1^ Invalid character
messages
"X •_ Function name ' olyline' will be known to MATLAB
.by its file name: TpolylineT.
•3 •._ Array f x* is constructed using subscripting.
Consider preallocating for speed
4j_ Array T y T is constructed using subscripting.
Consider preallocating for speed
Несмотря на это, M-Lint выдала сообщения о том, что в 3-й и 4-й строках
программы использованы индексированные массивы и не мешало бы поду-
мать над способами повышения скорости работы программы.
Над попытками включить в программу неинициализированные переменные
анализатор M-Lint надолго задумывался, но никаких сообщений не выдавал.
Зато на использование запрещенного имени функции (вместо polyline мы
набрали noiyiine) выдал очень разумное сообщение (рис. 4.16).
Start Prof iing j Run this code: j bench jrj • Profile tlrocMO sec
! Profile Summary
\ Generated ll-Sep-2004 18:54:26
\ Function name Calls Total Self Total Time Plot
Time lime* (dark band = self
time)
1
graphics » rivate\clo ;47 0.359 s 0.156 s I ; '•' j
И'ЛиИ-Я————
+ 4 с 0:\ШШ
•••••Ml
Start Proflbfl I RLBI W« code J bench •^1 eProffletimeMOsec
Profile Summary
j denerated 1 l-Sep-2004 21:06:32
• Fiuittion name Calls Total Self i Total Time Plot
Time Time* (dark band = self
i time)
automesh 7 Os 0.000 s
Sa x k 3 0.031s 0.016 s
:
•• «• с _]в :«
Start Profiling I Run tins сей*, bench J*J •prontethiaiOsec
% Time
; Line Number Code Calls _ . :
Time Time Plot »
f4 "' ' :.'••: __
Profiler 1 Command VWKlow : ' " .
*• •* о _ i : # i «
Start Profahg j RuntNs code: j bench bprotietiiwlOsec
....-d
Lines where the most time was spent • -•••" _ J
Total Time
Line Number Code Calls
Time Time Plot
434 jyout_now = [ntrp45(tref, t , y, [ ] . . • 1080 0.234 s 23.8%
ШЛ±И-ПИ
•НИ•i •HI шшшшшшШшшшшша
Start Profiling j Run this code: j bench jrj ^Proiietime- 10 sec
'«1
Profiler 1 Command Window ..'
:
j il
Profiler , X
i M-Lint results IJ
\ Line number Message _j
T
402 he value assigned here to variable 'ignore' i s never used
I Coverage results
li-J-UM.VJi
^
••••••
"Ф 't tj$ ' a ' i t •••• ••••••••
Start Profing j Run this code j bench 2 Ф Profle tfme: 10 sec
1 t 0.ГЦ 1 3 2 6 __
330 tnew = t + hA(6);
1 t и.о.: 132a 3 3 1 i f done
' •• i\. j ; 3 •fl? tnew = t f i n a l ; % H i t end p o i n t e x a c t l y .
333 end
| ' 0.03. 132o 3 34 h = tnew - t ; % P u r i f y h.
символьным переменным
% Формирование вектора-строки
» str='ABCDE'
str =
ABCDE
» whos
Name Size Bytes Class
str 1x5 10 char array
Grand total is 5 elements using 10 bytes
% Формирование массива строк
» str_mas=['1234';'ABCD']
str_mas =
1234
ABCD
» whos
Name Size Bytes Class
str_mas 2x4 16 char array
Grand total is 8 elements using 16 bytes
% Формирование массива символьных ячеек
» str cell=[{'123','ABCD'};{'4567','abc'}]
166 Глава 5
str_cell =
423' 'ABCD'
•4567' 'abc'
» whos
Name Size Bytes Class
str cell 2x2 268 cell array
Grand total is 18 elements using 268 bytes
» char(32:64)
ans =
!"#$%&' ()* + ,-./0123456789:;<=>?@
» char(65:96)
ans =
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]Л_~
» char(97:126)
ans =
abcdefghijklmnopqrstuvwxyz{I}~
» char(1025 1105)
ans =
Ее
» char(1040:1071)
ans =
АБВГДЕЖЗИЙКПМНОПРСТУФХЦЧШЩЬЫЬЭЮЯ
» char(1072:1103)
ans =
абвгдежзийклмнопрстуфхцчшщъыьэюя
» S=char({'ABC, 4234'})
S =
ABC
1234
» whos
Name Size Bytes Class
S 2x4 16 char array
Grand total is 8 elements using 16 bytes
;..,,............................. ,.
; Пример 5.5. Извлечение символа из массива строк •
» s = c h a r ( [ 4 8 49 50; 65 66 67; 1088 1089 1090])
012
Обработка символьных данных 169
две
рст
» s(2,3)
ans =
С
Для того чтобы извлечь из массива строк нужную строку, можно воспользо-
ваться одной из индексных конструкций, представленных в примере 5.6.
llIliiMMllWlIUlMl
нение строки из массива
ans =
ABC
» s (2,l:end)
ans =
ABC
» S=' 12345
S =
12345
» SL=strjust(S,'left')
SL =
12345
» SC=strjust(S,'center')
SC =
12345
» SR=strjust(S,'right')
SR =
12345
» SRl=strjust(S)
SRI =
12345
>> whos
Name Size Bytes Class
S lxll 22 char array
SC 1x11 22 char array
SL lxll 22 char array
SR lxll 22 char array
SRI lxll 22 char array
Grand total is 55 elements using 110 bytes
» repmat('=',1,4)
ans =
» repmat('*',3,4)
ans =
» S=strcat('123\ 'ABCDEFG')
S =
123ABCDEFG
172 Глава 5
» whos
Name Size Bytes Class
S 1x7 14 char array
Grand total is 7 elements using 14 bytes
» S=strcat(['123';'ABC],['5678';'abed'])
n
1235678
ABCabcd
» whos
Name Size Bytes Class
S 2x7 28 char array
Grand total is 14 elements using 28 bytes
» S=strcat({'123','ABCD'},{'45678','xz'})
S =
42345678' 'ABCDxz'
» whos
Name Size Bytes Class
S 1x2 148 cell array
Grand total is 16 elements using 148 bytes
эок с пробелаи
» S=strvcat(['123';'ABC'],['5678';'abed']
S=
123
174 Глава 5
ABC
5678
abed
» whos
Name Size Bytes Class
S 4x4 32 char array
Grand total is 16 elements using 32 bytes
» S=strvcat({'123*,'ABCD'})
S —
123
ABCD
» whos
Name Size Bytes Class
S 2x4 16 char array
Grand total is 8 elements using 16 bytes
своих законных местах. Такого же рода участь постигла буквы "ё" и "Ё" в-ко-
довой странице Windows с номером 1251.
Функции сравнения символьных данных, представленные в MATLAB, про-
изводят проверку только на равенство или неравенство операндов, в качест-
ве которых могут выступать не только строки, но и массивы строк. В по-
следнем случае операция сравнения выполняется над каждой парой
элементов с одинаковыми индексами. Результат каждого такого сравнения
вырабатывает логический признак 1 (истина) в случае совпадения значений
и логический признак о (ложь) в случае несовпадения. Если все промежу-
точные сравнения выработали единичные признаки, что свидетельствует об
абсолютном тождестве сравниваемых данных, то функция возвращает логи-
ческое значение 1. Если хотя бы в одном промежуточном сравнении обна-
ружено расхождение, то функция возвращает логическое значение о. Если
сравниваемые данные представлены массивами ячеек одинаковой размерно-
сти, то функция сравнения возвращает логический массив той же размерно-
сти, где каждый элемент равен 1 или о в зависимости от совпадения или
несовпадения значений соответствующих ячеек.
Для сравнения символьных данных язык MATLAB предлагает четыре функ-
ции: strcmp, strcmpi, strncmp и strncmpi. Первая из них производит по-
символьную проверку на равенство или неравенство всех элементов сравни-
ваемых операндов, вторая выполняет аналогичное сравнение, игнорируя
разницу между кодами больших и малых букв, третья сравнивает только за-
данное количество начальных символов, четвертая сочетает в себе возмож-
ности второй и третьей (пример 5.17).
%Сравнение векторов-строк
» S1='ABCDEFGH';
» S2='ABCDefgh';
» S3='ABCabc';
% Сравнение на абсолютное совпадение всех символов
» strcmp(S1,S2)
ans =
О
% Сравнение с игнорированием разницы между большими и малыми буквами
» strcmpi(SI,S2)
ans =
1
176 Глава 5
% Сравнение на абсолютное совпадение первых 3 символов
» strncmp(Sl,S2,3)
ans =
1
» whos
Name Size Bytes Class
SI 1x8 16 char array
S2 1x8 16 char array
S3 1x6 12 char array
ans lxl 1 logical array
Grand total is 23 elements using 45 bytes
% Сравнение символьных массивов
» SM1=['1234567';• АБВГДЕЕ'];
» SM2=['1234567';' АБВГдее'];
» strcmp(SMl,SM2)
ans =
1
» strncmp(SMl,SM2,4)
ans =
1
» strcmpi(SMI,SM2)
ans =
0
» SM3=['1234 56';' АБВГДЕ'];
» SM4=['123456';' АБВгде'];
» strcmpi(SM3,SM4)
ans =
1
% Сравнение массивов символьных ячеек
g. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
» SC1=[{'1234'},{'ABCDEFGH'}];
» SC2=[{4235'},{'ABCDefgh'}];
» strcmp(SCl,SC2)
ans =
0 0
» strcmpi(SCI,SC2)
ans =
0 1
Обработка символьных данных 177
» whos
Name Size Bytes Class
SCI 1x2 144 cell array
SC2 1x2 144 cell array
ans 1x2 2 logical array
Grand total is 30 elements using 290 bytes
>> strncmp(SCl,SC2 ,3)
ans =
1 1
; в символьных данных
» Sl='00';
» S2='2OO3';
» S3='100002';
» findstr(SI,S2) % Порядок операндов роли не играет
ans =
2
» findstr(S2,SI) % Порядок операндов роли не играет
ans =
2
» strfind(SI,S2) % Порядок операндов важен
ans =
[]
» strfind(S2,SI) % Порядок операндов важен
ans =
2
» S3='100002';
Обработка символьных данных 179
» SM=strvcat('com','compare','computer')
SM =
com
compare
computer
» strmatch('com',SM) % поиск строк, начинающихся с 'com'
ans =
1
2
3
» strmatch('com',SM,'exact') % поиск точного совпадения
ans =
1
180 Глава 5
» S='123com';
» strmatch{'com',S) % внутреннее вхождение игнорируется
ans =
[]
% Поиск в массиве ячеек
» S3=strrep(S,'123', " )
S3 =
44
» Sl='12341234';
» S2=strrep(Sl, 423', { " } )
S2 =
'44'
» whos
Name Size Bytes Class
51 1x8 16 char array
52 lxl 64 cell array
tl =
С
rl =
Новым Годом!
» [t2,r2]=strtok(rl)
t2 =
Новым
r2 =
Годом!
» [t3,r3]=strtok(r2)
t3 =
Годом!
гЗ =
Empty string: l-by-0
7 Зак 899
184 Глава 5
а Н и е Ч И С Л а
I '. .'.... .ВС1рОку... ' < * » • < , « . » U l . K K d t l ' I . M «
••.
k . k
•
l t . O K
•
M
' " - • ' • • '
> * ' • •
!
» num2str(pi)
ans =
3.1416
» whos
Name Size Bytes Class
ans 1x6 , 12 char array
Grand t o t a l i s 6 elements using 12 bytes
» num2str(pi,10)
ans =
3.141592654
» num2str(pi, 20) % Больше 17 цифр формат double не хранит!
ans =
3.1415926535897931
» x=sqrt(-2)
х=
0 + 1.4142i
» num2str(x,10)
ans =
0+1.4142135621
» whos
Name Size Bytes Class
ans 1x14 28 char array
x lxl 16 double array (complex)
Grand total is 15 elements using 44 bytes
Обработка символьных данных 185
» num2str(pi,'pi=%6.2f )
ans =
pi= 3.14
» whos
Name Size Bytes Class
ans 1x9 18 char array
Grand total is 9 elements using 18 bytes
ans =
Inf
» x=realmin
x=
2.2251e-308
» int2str(x)
ans =
0
» x=realmax
1.7977e+308
» int2str(x)
ans =
17 97 693134 862315700000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000
» length(ans)
ans =
309
» x=sqrt(-2)+5.8
X =
5.8000 + 1.4142i
» int2str(x)
ans =
6
» Sl=str2double('3.14159265')
S1 =
3.1416
» Sl=str2double( 4,000, 000'•)
SI =
1000000
» Sl=str2double('le6')
SI =
1000000 .
» Sl=str2double('l-2j')
SI =
1.0000 - 2.0000i
» whos
Name Size Bytes Class
x lxl 16 double array (complex)
у 1x2 32 double array (complex)
1\'-щшшшшшшдшш5: •• • : """""шшш
Перевод числа в двоичную систему
* ' . • • • . . . •
\
;
ans =
094
20D
3FF
318
» bin2dec('1100011000')
ans =
792
» hex2dec('318')
ans =
7 92
» base2dec('11132',5)
ans =
792
• " - •
• : ----- • ' '''ШШШШШШ
I Пример 5.40. Преобразование массива строк в десятичную систему I
» bin2dec(['101100';'001101'])
ans =
44
13
» whos
Name Size Bytes Class
ans 2x1 16 double array
» format long
» hex2num('400921FB54442D18')
ans =
3.14159265358979
.
! Пример 5.42. Преобразования символьной записи матриц
:;....,.,;!.... ....:
192 ' Глава 5
У=
[1 2;3 4]
» z=str2mat С [1 2;3 4] ')
z=
[1 2;3 4]
» whos
Name Size Bytes Class
X 2x2 32 double array
У 1x9 18 char array
z 1x9 18 char array
Grand t o t a l i s 22 e l e m e n t s u s i n g 68 b y t e s » x = [ l 2 ; 3 4]
ans =
Empty string: l-by-0
ans =
7b 0X7B
» s p r i n t f ( ' % d',123)
ans =
123
» s p r i n t f ( ' % d',-123)
ans =
-123
Таблица 5.1
Спецификатор Ф о р м а т результата
%с Единственный с и м в о л
%d Целое десятичное число с о з н а к о м
%е В е щ е с т в е н н о е число в ф о р м е с п л а в а ю щ е й запятой (порядок
идентифицирует буква е)
%Е В е щ е с т в е н н о е число в ф о р м е с п л а в а ю щ е й запятой (порядок
и д е н т и ф и ц и р у е т буква Е )
%f В е щ е с т в е н н о е число в ф о р м е с ф и к с и р о в а н н о й запятой
%д Компактная ф о р м а числа с фиксированной или плавающей запятой
%G Компактная ф о р м а числа с фиксированной или плавающей запятой
%о Целое восьмеричное число без з н а к а
%s Строка символов
%и Целое десятичное число без з н а к а
%х Целое шестнадцатеричное число с м а л ы м и б у к в а м и a — f
%х Целое шестнадцатеричное число с б о л ь ш и м и б у к в а м и A—F
Обработка символьных данных 195
» sprintf{'%bx',pi)
ans =
182d4454fb210940 % Здесь переставлены байты
» format long
» hex2num('400921FB54442D18')
ans =
3.14159265358979
» sprintf C%bx',l) \
ans =
000000000000f03f
» hex2num('3ff0000000000000')
ans =
1
» sprintf C%tx',l)
ans =
3f800000
196 ; Глава 5
Таблица 5.2
Символ Назначение
\Ь Удаление предшествующего символа (Backspace)
\f Перевод страницы (Form feed)
\п Перевод строки (New line)
\г Возврат каретки (Carriage return)
\t Горизонтальная табуляция (Horizontal tab)
\\ Обратная косая черта (Backslash)
\' Одинарная кавычка С)
%% Процент (%)
| П р и м е р 5.45. И с п о л ь з о в а н и е е д и н с т в е н н о г о ф о р м а т н о г о у к а з а т е л я i
lnlMMII «••Illllttl, Milt ^ll.tLIHIll..!. мННКНММИНПП';* •••>« I I I • tl •• », • I i » „ j , I I I I „.. .. I ., .• I M I • I I I I M I. 1
» s = '2.7183 3.1416';
» A = sscanf(s,'%f')
A «.
2.7183
3.1416
» sl=sprintf('%f',A)
si '=
2.7183003.141600
» s2=sl(l:8)
s2 =
2.718300
» s3=sl(9:end)
s3 =
3.141600
198 Глава 5
1 9
Обработка символьных данных 201
Перестановка местами необязательных параметров приводит к аналогичной
перестановке возвращаемых результатов:
» [m s]=regexp('123_abc 456_78','\d{3}','start','match')
т =
1 9
s =
423' '456'
» s ='abCD_ 123#';
» [mat ind]=regexp(s,'\s','match','start';
mat =
ind =
» [mat ind]=regexp(s,'\S','match','start')
mat =
'a' 'b' 'C 'D' '_' '1' '2' '#'
ind =
1 2 3 4 5 7 8 10
» [mat ind]=regexp(s,'\d','match','start')
mat =
4' '2' '3'
ind =
7 8 9
202 Глава 5
» [mat ind]=regexp(s,'\D','match','start')
mat =
'a' 'b' 'C 'D' '_' ' ' '#'
ind =
1 2 3 4 5 6 10
» [mat i n d ] = r e g e x p f s , ' \ w ' , ' m a t c h ' , ' s t a r t ' )
mat =
'a' 'b' 'C 'D' '_' '1' '2'
ind =
1 2 3 4 5 7 8
» [mat ind]=regexp(s,'\W,'match','start')
mat =
' ' '#'
ind =
6 10
2 8 17 25
» patl='H4\>';
» regexp(str,patl) % R в конце слова
ans =
12 31
A
» pat3=' uap';
» regexpi(str,pat3) %R в начале строки
ans =
1
ans =
31
» pat2='\<цар';
>> regexpi'(str,pat2) % R в начале слова
ans =
1 7
5 % Начальный индекс
t =
{lxl cell} % Массив ячеек для лексем
ans =
1
ide' % Выделенная лексема
» whos
Name Size Bytes Class
ans lxl 66 cell array
m lxl 70 cell array
pat 1x7 14 char array
s lxl 8 double array
str 1x22 44 char array
t lxl 126 cell array
» regexprep(s,pat,'эЮя','preservecase')
ans =
ЭЮЯэюя_ЭЮЯэюя_123
ans =
EFGH_efgh
» regexprep(s,pat,'EFGH','preservecase')
ans =
EFGH_efgh
» s='Abcd_aBCD';
» regexprep(s,pat,'EFGH','preservecase')
ans =
Efgh_EFGH
» regexprep(s,pat,'EFgh','preservecase1)
ans =
Efgh_EFgh
Работа с файлами
Как правило, файлы представляют собой именованные области внешней
(дисковой) памяти, с которыми программы могут обмениваться информаци-
ей. Необходимость в таких обменах возникает в разных ситуациях. Иногда
объем оперативной памяти недостаточен для хранения нужной информа-
ции, и тогда приходится прибегать к услугам внешней памяти, записывая
туда очередную порцию накопленных данных. В другой ситуации приложе-
ние может воспользоваться своими же данными, ранее записанными на
диск или полученными в результате работы других программ. Вообще гово-
ря, поставщиками или потребителями данных, с которыми наша программа
вступает в контакт, могут быть не только дисковые файлы, но и файлы-
устройства: дисплей, принтер, графопостроитель, сканер, клавиатура, кана-
лы связи и т. п. Данная глава посвящена работе с дисковыми файлами, хотя
обслуживание файлов-устройств происходит по аналогичной схеме.
Оценивая ключевые аспекты процесса обмена данными, можно сказать, что
работа с файлами в основном ограничивается тремя-четырьмя операциями:
• выделение ресурсов и приведение файла в состояние готовности к обме-
ну (именно это скрывается за термином открыть файл);
П чтение (ввод из файла) или запись (вывод в файл) очередной порции
данных;
• возврат выделенных ресурсов и завершение неоконченных операций
(этому соответствует термин закрыть файл).
К числу наиболее важных моментов, связанных с обменом информацией,
следует отнести формат представления данных на внешнем носителе. В боль-
шинстве своем почти все системы программирования (и MATLAB в этом
смысле — не исключение) используют два формата данных — текстовые и
двоичные.
Текстовые или символьные данные состоят из строк,, похожих на те, кото-
рые мы набираем при вводе с клавиатуры или видим при выводе на экране
дисплея. Для текстовых данных характерна переменная длина строки, за-
вершающейся невидимым признаком конца (обычно эту функцию выпол-
208 Глава 6
Таблица 6.1
» [name access]=fopen(0)
name =
"stdin"
access =
r
>> [name access]=fopen(1)
name =
"stdout"
access =
a
» [name access]=fopen(2)
name =
"stderr"
access =
a
» k=fopen('qq\ 'wt+')
212 Глава 6
к=
3
» [name access]=fopen(к)
name =
qq
access =
wt+
ИЛИ
st = f s e e k ( f _ i d , n , - l ) ;
ИЛИ
s t = fseek(f_id,n,1);
или
st = fseek(f_id,n,0);
68 % код буквы D
13 % к о д символа 'Возврат к а р е т к и '
10 % к о д символа 'Перевод с т р о к и '
48 % к о д цифры 0
49 % код цифры 1
50 % код цифры 2
51 % код цифры 3
52 % код цифры 4
53 % код цифры 5
к=
12 % количество считанных байтов
» a=char(a) % преобразование данных типа double в тип char
а = % теперь каждый элемент массива а — типа char
А % буква А
В % буква В
С % буква С
D % буква D
% неотображаемый символ 'Возврат каретки'
% неотображаемый символ 'Перевод строки'
% действие управляющего символа 'Перевод строки'
0 % цифра 0
1 % цифра 1
2 % цифра 2
3 % цифра 3
4 % цифра 4
5 % цифра 5
» а' % транспонирование вектора-столбца
ans = % вывод вектора-строки
ABCD
012345
S Ък 899
216 Глава 6
vuriiuo
» frewind(f_id)
» [a k]=fread(f id,8)
Таблица 6.2
» frewind(f_id)
» [a k]=fread(f_id,20, 'uchar',3)
а=
65
13
50
к=
3
» f_id=fopen('test.m', 'r1) ;
» [a k]=fread(f_id, inf, '3*uchar',2)
а =
65 % первое число из первой порции
66 % второе число из первой порции
67 % третье число из первой порции
% два байта пропущены
10 % первое число из второй порции
48 % второе число из второй порции
49 % т р е т ь е ч и с л о и з второй порции
% д в а байта п р о п у щ е н ы
52 % первое число из третьей порции
53 % второе число из третьей порции
m =
» f_id=fopen('test.m','r');
» a=fread(f_id,[3 4]) % читаем данные из файла в двумерный массив
65 68 48 51
66 13 49 52
67 10 50 53
» whos
Name Size Bytes Class
а 3x4 96 double array
f id lxl 8 double array
Работа с файлами 219
Из приведенного примера видно, что последовательно считываемые из фай-
ла элементы данных заполняют столбцы результирующей матрицы.
Если количество считываемых элементов в обращении к f read явно не ука-
зано, то данные читаются до конца файла. Точно такого же эффекта можно
добиться, указав в качестве размера порции бесконечную длину inf (или
inf) — пример 6.7.
» f_id=fopen('test.m','r');
» a=fread(f_id,inf)
а =
65
66
67
68
13
10
48
49
50
51
52
53
>> frewind(f_id)
» a=fread(f_id, [3,Inf])
a =
65 68 48 51
66 13 49 52
67 10 50 53
5 п
Пример 6.9. Преобразование форма-roi ричтении.^.*аил£
» frewind(f .id) ;
» a=fread(f__id, [3 4],'uchar=>uchar
а=
65 68 48 51
66 13 49 52
67 10 50 53
» whos
Name Size Bytes Class
а 3x4 12 uint8 array
f id lxl 8 double array
Обратите внимание на то, что при записи в двоичный файл никаких допол-
нительных управляющих кодов типа CR, LF не пишется. Мы можем прочи-
тать данные в их первозданном формате, если указать соответствие типов
(пример 6.11).
•••••• — •••••• • •• •
р и м е р 6 1 Ч т е н и е и з д в о и ч н о г о а й л а
! : * ... ц „ 1 •. i
» frewind(k)
» a4=fread(k,inf,'uchar=>char': % чтение и транспонирование
a4 =
ABCD012345
» k=fopen('abc.m','w');
>> cl=fwrite(k,al,'char') ,
» c2=fwrite(k,a2,'char') ,
» fclose(k);
» k=fopen('abc. m', 'r');
» a4=fread(k,inf,'*char';
a4 =
ABCD012345
» al='ABCD';
» k=fopen('abc.m','w');
» cl=fwrite(k,al,'uchar',2) % запись с разрядкой
cl =
4 % количество переданных элементов массива
» fclose(k);
» k=fopen('abc.m','r');
» a4=fread(k,inf,'uchar')
a4 =
0 % первый элемент разрядки
О % второй элемент разрядки
65 % первый элемент массива al
О
О
66 % второй элемент массива al
О
О
67 % третий элемент массива,al
О
О
68 % четвертый элемент массива al
Убедитесь в том, что длина файла 12 байтов и после кода буквы "С"
(шестнадцатеричный код 43) расположена пара байтов ODOA.
224 Глава 6
cl =
5
» fclose(f_id);
41 42 43 44 0D Qfl 'RBCDJfi
1риформатной записи
» il=125;
» i2=2003;
» r3=2.3456;
» fprintf('%5d %d %8.3f\n',il,i2,r3);
125 2003 2.346
Таблица 6.3
» а=1б;
» Ь=-1б;
» fprintf ('%5d\n%5d\a,b)
16 % число прижато к правой границе поля
-16 % число прижато к правой границе поля
» fprintf('% + 5d\n%5d\a,b)
+16 % знак + у положительного числа
-16
» fprintf('%-5d\n%-5d',a,b)
16 % число прижато к левой границе поля, знак + не выводится
-16 - % число прижато к левой границе поля
» fprintf('%- 5d\n%-5d',a,b)
16 % прижим к левой границе, пробел вместо знака +
-16 % прижим к левой границе
» fprintf('%5х\п%#5х',а,а);
10
0x10 % префикс Ох у шестнадцатеричного числа '
230 . Глава 6
» f p r i n t f ('%5X\n%#5X\a,a) ;
10
0X10 % префикс ОХ у шестнадцатеричного числа
» fprintfC%5o\n%#5o',a,a);
20
020 % префикс — цифра 0 у восьмеричного числа
» fprintf('%05d',a)
00016 % дополнение числа незначащими нулями
( Замечание J
Приведенный выше текст в точности соответствует содержимому Command
Window (Окно команд) среды MATLAB 6.5. Однако в среде MATLAB 7 после
вывода данных по функции f p r i n t f символы новой команды (>>) не пере-
водятся в начало следующей строки. На результат вычислений и на продол-
жение работы это влияния не оказывает, но должного порядка на экране не
наблюдается.
» z=1.8;
» fprintf('%d',z)
1.800000е+000 % вместо формата %d использован формат %е
» fprintf('%x',z)
1.800000е+000 % вместо формата %х использован формат %е
» fprintf('%u',z)
1.800000е+000 % вместо формата %и использован формат %е
» fprintf('%f',z)
1.800000 % незначащие нули в дробной части выводятся
» fprintf('%е',z)
1.800000е+000 % незначащие нули в дробной части выводятся
» fprintf('%E',z)
1.800000Е+000 % незначащие нули в дробной части выводятся
» fprintf('%g',z)
1.8 % незначащие нули в дробной части не выводятся
Работа с файлами 231
» fprintf('%bx\n%bx',l,-l)
3ff0000000000000
bffOOOOOOOOOOOOO
» fprintf('%tx\n%tx',l,-1)
3f800000
bf800000
( Замечание )
Если в списке данных, выводимых в текстовый файл, встречаются комплекс-
ные переменные или выражения, то в обработку включаются значения только
вещественных частей (пример 6.22).
» a=l+2*i
1.0000 + 2.0000i
» b=3+4*j
b =
3.0000 + 4.0000i
» fprintf ('%4.2f\n%4.2f,a,b)
1.00
3.00
Символ Описание
Замечание
В том случае, когда в текстовый файл с помощью функции f p r i n t f записыва-
ется единственная строка, строка форматных указателей может быть опущена
(пример 6.25).
• - • •
» m=fprintf('ABCDEFGH IJKLMN1);
ABCDEFGH IJKLMN
» m
m=
15
Здесь:
• a — принимающий массив, в элементы которого заносятся считываемые
данные;
П п — количество фактически считанных значений;
• f_id — номер открытого файла;
• format — список форматных указателей, в соответствии с которыми
осуществляется преобразование считываемых данных;
• m — количество запрашиваемых данных.
Обязательными параметрами в этом обращении являются массив а, иденти-
фикатор файла f i d и хотя бы один форматный указатель в списке format.
Отсутствие количества запрашиваемых значений или константа inf в каче-
Работа с файлами 235
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
n=fprintf(к, •%d \a) % записали массив а в файл
4
10
n—
5
» whos
Name Size Bytes Class
a 5x5 200 double array
b 5x5 200 double array
с 5x1 40 double array
к lxl 8 double array
n lxl 8 double array
» frewind(k);
» [d n]=fscanf(k,'%d %*d')
Работа с файлами 237
d =
17
4
11
5
12
1
13
25
14
21
15
22
9
13
» k=fopen('а.txt','wt');
» fprintf(k,'%s\'ABCD 012345' % записали строку с пробелом
ans =
11 количество записанных байтов
» fclose(k);
» k=fopen('a.txt', 'rt') ;
» [a n]=fscanf (k, '%s', 1) % прочитали 1 элемент до первого пробела
a=
ABCD
n =
» frewind(k) ;•
» [a n]=fscanf(k,'%s',2) прочитали 2 элемента
238 Глава 6
Замечание
В среде MATLAB 7 этот пример выполняется неправильно — вслед за пятым
числом извлекается несуществующий 0. Скорее всего это ошибка системы.
Для того чтобы читать не все данные, среди входных аргументов должны
находиться форматная строка и количество запрашиваемых чисел (при-
мер 6.30).
240 Глава 6
.Пример 6.30.
ное чтение из текстового файла с
шшшшшшшшшшшшшшшт .шмттшшш
» b=textread('a.txt','%d',2)
b -
[Ы Ь2 ЬЗ Ь4 b51-textreadCa.txt 1 , %d %d %d
bl
b2 =
ЬЗ =
Ь4 =
Ь5 =
Работа с файлами 241
1
» [ Ы Ь З b 5 ] = t e x t r e a d ( ' a . t x t , ' % d % * d %d % * d % d ' )
Ы =
1
ЬЗ =
3
Ь5 =
5
Форматная строка может быть пуста, но при этом из текстового файла мож-
но прочитать только числовые данные (пример 6.34).
» b=textread('а.txt', " )
b=
1 2 3 4 5
С Замечание ^
В среде MATLAB 7 этот пример выполняется неправильно — вслед за пятым
числом извлекается несуществующий 0. Скорее всего это ошибка системы.
Таблица 6.6
Таблица6.6 (окончание)
» [names,types,у,answer] = textread('datal.dat','%9c%5s%*f%2d%3s')
names =
Sally
Joe
Bill
types =
'Typel'
•Type2'
'Typel'
У =
45
60
12
246 Глава 6
answer =
'Yes'
'No'
'No'
» whos
Name Siz Bytes Class
» file = textreadCdatal.dat','%s','delimiter','\n','whitespace','')
file =
'Sally Typel 12.34 45 Yes1
'Joe Type2 23.54 60 No 1
'Bill Typel 34.90 12 No'
» whos
Name Size Bytes Class
file 3x1 338 cell array
9 Зак 899
248 Глава 6
1
Туре2'
'23.54'
'60'
'No'
•Bill'
'Typel'
'34.90'
'12'
'No'
» whos
Name Size Bytes Class
file 15x1 1010 cell array
» data = textread('data2.dat','','delimiter',',')
data =
1 2 3 4
5 6 7 8
9 10 11 12
» [data]=textread('data2.dat','%n','delimiter',',')
data =
1
Работа с файлами 249
2
3
4
5
6
7
8
9
10
11
12
5,6,,8
9,10,11,,
Воспользуемся свойством emptyvalue, которое позволяет заменить отсутст-
вующие данные указанным значением (пример 6.45).
1
• • • • - •••••••••••• •••••
: • '••••
5 6 NaN 8
9 10 11 NaN
( Замечание ^
В среде MATLAB 7 этот пример выполняется неправильно — в результате по-
является лишний пятый столбец, содержащий только элементы NaN. Мы сохра-
нили правильную выдачу, полученную в среде MATLAB 6.5. Скорее всего это
ошибка системы.
5,6,,8
9,10,11,
» data = textread('data3.dat','','delimiter',',', 'emptyvalue',NaN)
data =
1 NaN 3 4
5 6 NaN 8
9 10 11 0
C~ Замечание ^
В среде MATLAB 7 и этот пример выполняется неправильно — вместо послед-
него нулевого элемента появляется NaN. Скорее всего это ошибка системы.
( Замечание ^
Данные в dim-файл записываются только один раз. Любая последующая за-
пись в файл с тем же именем уничтожает предыдущие данные.
» b=dlmread( 'dlm.txt
b=
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
252 Глава 6
» c=dlmread('dim.txt',';',2,1)
с =
7 6 12
14 15 1
I 1
» d=dlmread( dlm.txt ,'; \ [0 1 2 3]
d =
2 3 13
11 10 8
7 6 12
• ь •> Ь'У
ШШШШШЙЁЙШ " • • :
» а=[1 2 3 4 5 6] ;
» dlmwrite('dlm.txt',a,',')
» b=dlmread('dim.txt',',')
b =
1 2 3 4
» c=[l;2;3;4;5;6];
» dlmwrite('dim.txt', с,', ')
» d=dlmread('dim.txt',',')
d =
1
2
3
4
5
6
Глава 7
Таблица 7.1
I :;£*^££;*£Х?;:' Z ;
\ Пример 7.1. Свойства объекта Root ;
L , ,.;.. : :
get(0)
CallbackObject = []
Иерархия графических объектов и их свойства 261
®и
~ 1 , ;
» х=0:0.2:6.28;
» y=sin(x);
» plot(х,у)
» h_Fig=gcf;•
» get(h_Fig) % Отображение всех свойств текущего окна
Иерархия графических объектов и их свойства 267
Alphamap = [ (1 by 64) double array]
BackingStore = on
CloseRequestFcn = closereq
Color = [0.8 0.8 0.8]
Color-map = [ (64 by 3) double array]
CurrentAxes = [101.001]
CurrentCharacter =
CurrentObject = []
CurrentPoint = [0 0]
DockControls = on
DoubleBuffer = on
FileName =
FixedColors = [ (10 by 3) double array]
IntegerHandle = on
InvertHardcopy = on
KeyPressFcn =
MenuBar = figure
MinColormap = [64]
Name =
NextPlot = add
NumberTitle = on
PaperUnits = centimeters
PaperOrientation = portrait
PaperPosition = [0.634517 6.34517 20.3046 15.2284]
PaperPositionMode = manual
PaperSize = [20.984 29.6774]
PaperType = A4
Pointer = arrow
PointerShapeCData = [ (16 by 16) double array]
PointerShapeHotSpot = [11]
Position = [120 90 560 420]
Renderer = painters
RendererMode = auto
Resize = on
ResizeFcn =
SelectionType = normal
ShareColors = on
ToolBar = auto
Units = pixels
268 Глава 7
WindowButtonDownFcn =
WindowButtonMotionFcn =
WindowButtonUpFcn =
WindowStyle = normal
WVisual = f (1 by 77) char array]
WVisualMode = auto
BeingDeleted = off
ButtonDownFcn =
Children = [101.001]
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [0]
Selected = off
SelectionHighlight = on
Tag =
Type = figure
UIContextMenu = []
UserData = []
Visible = on
и т. п.). Без этого события окно не может быть уничтожено, и работа про-
граммы, соответственно, не может быть продолжена.
Окну присвоен стандартный заголовок Figure 1. Дополнительный заголовок
графического окна в виде строки хранится в свойстве Name. По умолчанию
это свойство представлено пустой строкой, и в заголовках окон мы видим
надписи типа Figure I, Figure 2, и т. д. Если свойству Name присвоить какое-
либо значение, например,
h_Fig.Name = 'Оптимизация f(x)'
то заголовком окна будет строка вида:
Figure 1 : Оптимизация f(x)
Можно отказаться от стандартной нумерации окон (Figure I, Figure 2 и т. д.),
если присвоить свойству NumberTitle значение off.
Свойство MenuBar управляет отображением стандартного главного меню
графического окна. В режиме MenuBar=figure это меню создается и ото-
бражается, в режиме MenuBar=none — не создается и не отображается. Неза-
висимо от значения этого свойства мы можем выполнить команду uimenu,
чтобы создать нестандартное меню графического окна.
Свойство Backingstore, принимающее значение on или off, управляет ис-
пользованием специального буфера, расположенного' в оперативной памяти
и применяемого для запоминания копии окна во время работы программы.
Если часть окна перекрывается на экране, то его содержимое может быть
быстро восстановлено путем копирования буфера в видеопамять.
Когда пользователь пытается закрыть графическое окно (это можно сделать
разными способами — нажать кнопку с крестиком в заголовке окна, вы-
брать в меню команду Close (Закрыть) или выйти из системы MATLAB),
возникает событие "Запрос на закрытие". На это событие может отреагиро-
вать специальный обработчик, предусмотренный программистом, или сис-
темная программа, если пользователя устраивают действия системы по
умолчанию. А сводятся системные действия к тому, что все скрытые указа-
тели из режима off переводятся в режим on, и все созданные объекты уда-
ляются. Соответствующая системная функция имеет имя closereq, которое
ПО умОЛЧаНИЮ Присвоено СВОЙСТВУ CloseRequestFcn.
Один из вариантов пользовательского обработчика указанного события при-
веден в документации и его слегка переработанный текст представлен в
примере 7.3.
switch selection,
case 'Yes' delete(gcf)
case 'No' return
end
Таблица 7.2
прим, о ШЩЩЩШШщ
» get(gca)
ActivePositionProperty = outerposition
ALim = [0 1]
ALimMode = auto
AmbientLightColor =[111]
Box = on
CameraPosition = [3.5 0 17.3205]
CameraPositionMode = auto
CameraTarget = [3.5 0 0]
CameraTargetMode = auto
CameraUpVector = [ 0 10]
CameraUpVectorMode = auto
CameraViewAngle = [6.60861]
CameraViewAngleMode = auto
CLim = [0 1]
CLimMode = auto
Color =[111]
CurrentPoint = [ (2 by 3) double array]
ColorOrder = [ (7 by 3) double array]
DataAspectRatio = [3.5 1 1]
DataAspectRatioMode = auto
DrawMode = normal
FontAngle = normal
FontName = Helvetica
FontSize = [10]
FontUnits = points
FontWeight = normal
GridLineStyle = :
Layer = bottom
LineStyleOrder = -
LineWidth = [0.5]
276 Глава 7
MinorGridLineStyle = :
NextPlot = replace
OuterPosition =[0011]
PlotBoxAspectRatio =[111]
PlotBoxAspectRatioMode = auto
Projection = orthographic
Position = [0.13 0.11 0.775 0.815]
TickLength = [0.01 0.025]
TickDir = in
TickDirMode = auto
Tightlnset = [0.047619 0.0396825 0.00892857 0.0178571]
Title = [102.001]
Units = normalized
View = [0 90]
XColor = [ 0 0 0 ] ,
XDir = normal
XGrid = off
XLabel = [103]
XAxisLocation = bottom
XLim ==[0 7]
XLimMode = auto
XMinorGrid = off
XMinorTick = off
XScale = linear
XTick = [ (1 by 8) double array]
XTickLabel =
0
1
2
3 '
4
5
6
7
XTickLabelMode = auto \
XTickMode = auto
YColor = [ 0 0 0]
YDir = normal
Иерархия графических объектов и их свойства 277
YGrid = off
YLabel = [104]
YAxisLocation = l e f t
YLim = [-1 1]
YLimMode = auto
YMinorGrid = off
YMinorTick = off
YScale = linear
YTick = [ (1 by 11) double array]
YTickLabel = [ (11 by 4) char array]
YTickLabelMode = auto
YTickMode = auto
ZColor = [ 0 0 0]
ZDir = normal
ZGrid = off
ZLabel = [105]
ZLim = [-1 1]
ZLimMode = auto
ZMinorGrid = off
ZMinorTick = off
ZScale = linear
ZTick = [-1 0 1]
ZTickLabel =
ZTickLabelMode = auto
ZTickMode = auto
BeingDeleted = off
ButtonDownFcn =
Children = [3.00098]
Clipping = on
CreateFcn =
DeleteFcn =
BusyActlon = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [1]
Selected = off
SelectionHighlight = on
278 Глава 7
Tag =
Type = axes
UIContextMenu = []
UserData = []
Visible = on
Таблица 7.3
|«> F i g u r e 1
1
File Edit'view Insert Tools: Desktop Window Help"
l-'jal;x|
. • . • .. ц ,
Ос <$. Ф «JOB! в О
/ 4
\
0.5
//
\
-
0(
\
-0.5
\
1
0 2
v "«
1 К •У5 '-:
4
Рис. 7.4. Автоматический выбор шагов по обеим осям
282 Глава 7
l-> Figure I
File: Edit View Insert Tools Desktop. Window. Help
0.5
-0.5
О г;:л-У 4 6
•* Figure I
File Edit View Insert Tools Desktop Window Help
» x=0:0.1:2*pi;
» y=sin(x);
» h lin=plot(x,y);
» get(h lin)
Color: [0 0 1]
EraseMode: 'normal'
LineStyle: i _ ?
LineWidth: 0.5000
Marker: 'none'
MarkerSize: 6
MarkerEdgeColor: 'auto'
1
MarkerFaceColor: none'
XData: [1x63 double]
YData: [1x63 double]
ZData: [1x0 double]
284 Глава 7
BeingDeleted: 'off
ButtonDownFcn: []
Children: [Oxl double]
Clipping: 'on'
CreateFcn: []
DeleteFcn: []
BusyAction: 'queue'
HandleVisibility: 'on'
HitTest: 'on'
Interruptible: 'on'
Selected: 'off
SelectionHighlight: 'on'
Tag: ''
Type: 'line'
UIContextMenu: []
UserData: []
Visible: 'on'
Parent: 151.0079
DisplayName: ''
XDataMode: 'manual'
XDataSource: ''
YDataSource: ''
ZDataSource: ''
» t = 0:pi/20:2*pi;
» h_Linl = plot(t,sin(t),'k'|;
» h_Lin2 = line(t+.06,sin(t),'LineWidth',4,'Color',[.8 .8 .8]);
>> set(gca,'Children',[h_Linl h_Lin2])
0.8
0.6
0.4
0.2
/ X
-0.2 -
-0.4
-0.6
/
-0.8 \
:
1
) 1 2 '••„З 4 5 6 г • • ••..••••••
0.8 . /
0.6 - /
0,4 - /
0.2 -/
01
-0.2
-0.4
-0.6
-о.а
-1
Свойство Position определяет координаты левого нижнего угла (х, у), ши-
рину w и высоту h прямоугольника. Нулевые значения свойства Curvature
(кривизна) соответствуют построению прямоугольника. Максимальные зна-
чения составляющих rx, rу равны 1, и при них прямоугольник превращает-
ся в эллипс.
Построим пару прямоугольников, чтобы познакомиться с другими свойст-
вами этих объектов (пример 7.9).
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [102.006]
Selected = off
SelectionHighlight = on
Tag =
Type = rectangle
UIContextMenu = []
UserData = []
Visible = on
» rectangle('Position',[0.5,0.5,3,1],... •
'Curvature',0.4,'LineWidth',2,'LineStyle','—']
» xlim([0,4])
» ylim([0,2])
» daspect([1,1,1])
290 Глава 7
1.5
\
1
I
\ /
0.5
0
) 0.5 : 1 ' 15 2 ' 2.5 3 К>3.5\ 4
• -
» rectangle('Position',[1,2,5,10],'Curvature', [1,1],...
'FaceCoior','г')
12
10
i f
Left
Center
Right
Ragplinp Bottom
Middle
Top cap
» get(h_Txt)
BackgroundColor = none
Color = [ 0 0 0]
EdgeColor = none
EraseMode = normal
Editing = off
Extent = [0.493151 0.444444 0.260274 0.1]
FontAngle = normal
. FontName = Helvetica
FontSize = [10]
FontUnits = points
FontWeight = normal
Иерархия графических объектов и их свойства 293
HorizontalAlignment = left
LineStyle = -
LineWidth = [0.5]
Margin = [2]
Position = [0.5 0.5 0]
Rotation = [0]
String = Hello, World!
Units = data
Interpreter = tex
VerticalAlignment = middle
BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = off
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [102.007]
Selected = off
SelectionHighlight = on
Tag =
Type = text
UIContextMenu = []
UserData = []
Visible = on
-©-
P
\gamma Y \chi X \infty oo
\delta 5 \psi \clubsuit *
\epsilon e \omega CO \diamondsuit •
\wedge Л \times X \0 0
\rceil 1 \surd V \rnid I
\vee V \varpi та \copy right ©
Mangle < \rangle >
» х = 0:pi/20:2*pi;
» plot (x, sin (x) )
» text(pi,0,' Ueftarrow sin(\pi)','FontSize',18)
чая надпись
I......
» text(.1,.1,'Hello, World!','Rotation',45)
.• .
о.в
0.6
.-
0,4 •.
0.2
n
°C)• 0.2 0,4 ' 0.6 0.8; '• : 1 , . ••
0.8
0.6
4Hello. World!"
d.4
0.2
» get(h)
AlphaData = [1]
AlphaDataMapping = none
CData = [ (3 by 3) double array]
CDataMapping = direct
EraseMode = normal
XData = [1 4]
YData = [1 3]
BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [101.001]
Selected = off
SelectionHighlight = on
Tag =
Type = image
UIContextMenu = []
UserData = []
Visible = on
ans =
1 2 3
5 6 7
9 10 11 12
302 Глава 7
; Пример
» imfinfo('aero.jpg')
ans =
Filename: 'aero.jpg'
FileModDate: '28-Mar-2002 21:40:54'
FileSize: 17774
Format: 'jpg'
FormatVef'sion: ''
Width: 319
Height: 396
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
Comment: {}
319
k =
Иерархия графических объектов и их свойства 305
1
» figure('Units ,'pixels','Position',[100 100 n m])
» image (A);
•> Figure 1
File Edit View' Insert Tools Desktop Window' Help
•> Figure 2
flte |di Viev Inset Tool Desktc Windo Це1[ »
•••-infxj
File Edi Viev Inset Tool Desktc Windo Half *
• & а # ' k! ®.e ;о
• m l
8
в
100 200 300
№ R G В № R G В
1 0 0 0,5625 26 0,1250 1,0000 0,8750
2 0 0 0,6250 27 0,1875 1,0000 0,8125
3 0 0 0,6875 28 0,2500 1,0000 0,7500
4 0 0 0,7500 29 0,3125 1,0000 0,6875
5 0 0 0,8125 30 0,3750 1,0000 0,6250
6 0 0 0,8750 31 0,4375 1,0000 0,5625
1 0 0 0,9375 32 0,5000 1,0000 0,5000
8 0 0 1,0000 33 0,5625 1,0000 0,4375
9 0 0,0625 1,0000 34 0,6250 1,0000 0,3750
10 0 0,1250 1,0000 35 0,6875 1,0000 0,3125
11 0 0,1875 1,0000 36 0,7500 1,0000 0,2500
12 о 0,2500 1,0000 37 0,8125 1,0000 0,1875
13 0 0,3125 1,0000 38 0,8750 1,0000 0,1250
14 0 0,3750 1,0000 39 0,9375 1,0000 0,0625
15 0 0,4375 1,0000 40 1,0000 1,0000 0
16 о 0,5000 1,0000 41 1,0000 0,9375 0
17 0 0,5625 1,0000 42 1,0000 0,8750 о
18 0 0,6250 1,0000 43 1,0000 0,8125 0
19 0 0,6875 1,0000 44 1,0000 0,7500 0
20 0 0,7500 1,0000 45 1,0000 0,6875 0
21 0 0,8125 1,0000 46 1,0000 0,6250 0
22 0 0,8750 1,0000 47 1,0000 0,5625 0
23 0 0,9375 1,0000 48 1,0000 0,5000 0
24 0 1,0000 1,0000 49 1,0000 0,4375 0
25 0,0625 1,0000 0,9375 50 1,0000 0,3750 0
Глава 7
зов
Таблица 7.5 (окончание)
№ R G В № п G В
51 1,0000 0,3125 0 58 0,8750 0 0
52 1,0000 0,2500 0 59 0,8125 0 0
53 1,0000 0,1875 0 60 0,7500 0 0
54 1,0000 0,1250 0 61 0,6875 0 0
55 1,0000 0,0625 0 62 0,6250 0 0
56 1,0000 0 0 63 0,5625 0 о
57 0,9375 0 0 64 0,5000 0 0
Аргументами функции image кроме матрицы цветности могут быть два двух-
элементных вектора х и у, которые подменяют диапазоны маркировки осей
изображения:
» image(x,у,С)
Таким же образом могут быть изменены и любые другие свойства при соз-
дании объекта типа image:
» h_Img=image('свойство1',значение1,'свойство2',значение2,...);
Список форматов графических файлов, содержимое которых может быть
извлечено с помощью функции imread, приведен в табл. 7.6. На самом деле
за каждым из этих форматов скрывается довольно много вариантов, отли-
чающихся глубиной палитры (т. е. количеством битов на код цветности
пиксела), использованием того или иного метода сжатия данных, количест-
вом изображений, закодированных в одном файле. Поэтому функция imread
допускает несколько частных форматов обращения для конкретных графи-
ческих файлов. Узнать об этих деталях вы сможете, обратившись за справ-
кой ПО функции imread.
Таблица 7.6
» size(map)
ans = % размерность палитры
256 3
» size(Alpha)
ans = % размерность матрицы "прозрачности"
32 32
15 20 ; 2S , , 30
11 Зак. 899
312 Глава 7
10 15 >
,• ,.,.':• 20 25
Для текущего графического окна (объекта типа Figure), текущего поля гра-
фика (объекта типа Axes) и объекта, выбранного в данный момент пользова-
телем (объекта, генерирующего событие Callback), можно воспользоваться
системными функциями gcf, gca и gcbo соответственно. Но если нужный
графический объект не принадлежит ни к одной из перечисленных катего-
рий, то восстановлению его указателя поможет функция findobj. Для обра-
щения к ней достаточно знать значение какого-либо свойства, характерного
для искомой фигуры.
Иногда перед обращением к функции findobj полезно узнать перечень объ-
ектов, среди которых имеет смысл производить поиск. Для формирования
списка указателей объектов, порожденных графическим объектом с извест-
ным указателем h_obj, следует обратиться к функции findali (пример 7.22).
..........ж.„..;.7..;,.!.................
указателей на все объекты ;
» x=0:0.1:2*pi;
» plot (x, sin(x) )
» h_All=findall(gca)
h_All =
101.0020
3.0016
» get(h_All(1),'Type')
ans =
axes
» get(h_All(2),'Type')
ans =
line
Проектирование интерфейса
Все Windows-приложения делятся на две категории — консольные и оконные.
Консольные приложения, которые могут быть созданы в большинстве со-
временных систем программирования (Visual C++, Borland C++ Builder
(ВСВ), Delphi и др.), напоминают программы, функционирующие под
управлением MS-DOS. В их распоряжении вся оперативная память и экран,
режим работы которого максимально приближен к текстовому. Ввод данных
консольного приложения может быть организован либо их чтением из фай-
ла, либо путем их набора на клавиатуре.
В отличие от этого, оконные Windows-приложения включают одно или не-
сколько окон, одновременно расположенных на экране, которые могут пе-
ремещаться, изменять свои размеры, пропадать и возникать вновь. Для вво-
да и вывода данных оконные приложения предлагают своеобразные "фор-
точки" — редактируемые поля ввода/вывода символьной информации, вы-
деленные в окнах прямоугольные области для отображения графической
информации. В оконных приложениях используется большой набор типо-
вых компонентов, обеспечивающих диалоговое взаимодействие с пользова-
телем — разнообразные кнопки, списки, индикаторы состояния различных
процессов, полосы прокрутки, рамки и т. п.
Система MATLAB тоже позволяет создавать оконные Windows-приложе-
ния, в которых широко представлены средства управления отображением
2D- и ЗО-объектов. Наряду с этим, MATLAB предлагает довольно скром-
ный ассортимент компонентов, ориентированных на проектирование гра-
фического интерфейса. Тем не менее все эти компоненты оформлены в
соответствии со стандартами Windows. Набор их свойств покрывает ос-
новные функциональные возможности аналогичных компонентов, пред-
лагаемых современными системами визуального программирования. Пол-
ный перечень интерфейсных компонентов MATLAB приведен в табл. 8.1.
Роль общепринятых форм — стандартных окон Windows — в приложениях
MATLAB выполняют графические объекты типа Figure. Конечно, в таких
окнах не обязательно присутствие объекта типа Axes, в котором строятся
графические изображения.
316 Глава 8
Таблица 8.1
lefttop • ;•.;
: centertop
righttop
leftbottom
cenlerbottom
rlghtbottom
TitlePosition
'Свойство_к',Значение_к)
» а=1.5;
» Ь=-2.4;
» с=0.75;
» р=[а b с];
» x=roots(р)
X=
1.1742
0.4258
» p o l y v a K p , 1.1742)
Проектирование интерфейса 323
ans =
3.8460е-005
» polyvaKp, 0.4258)
ans =
3.8460е-005
» format long
» x
X =
1.17416573867739
0.42583426132261
» polyvaKp, 1.17416573867739)
ans =
-4.329869796038111e-015
» polyvaKp, 0.42583426132261)
ans =
-4.551914400963142e-015
/ Figure 1
Pile Edit yi Tools, gesktop Window _Help
function roots2
% глобальные переменные
global hFig hAxes hBtn
global hTxta hTxtb hTxtc hTxtxl hTxtx2
global hEda hEdb hEdc hEdxl hEdx2
h f i g = f i g u r e ( ' P o s i t i o n ' , [ 5 0 , 5 0 , 4 8 0 , 300]) ;
hAxes=axes;
set(hAxes,'Unit','pixels','Position',[30,70,280,220])
hTxta=uicontrol(hFig,'Style','text','String','a=', . . .
'Position', [340,253,30,21] , 'BackgroundColor1, [1 1 1] ',
hTxtb=uicontrol(hFig,'Style','text', 'String','b=\ ...
'Position', [340,218,30,21],'BackgroundColor', [1 1 1] !
Проектирование интерфейса 325
hTxtc=uicontrol(hFig,'Style','text','String','c=',...
'Position',[340,188,30,21],'BackgroundColor',[1 1 1]);
hTxtxl=uicontrol(hFig,'Style','text','String','xl=',...
'Position',[340,113,30,21],'BackgroundColor',[1 1 1]);
hTxtx2=uicontrol(hFig,'Style','text','String','x2=
'Position', [340,78,30,21],'BackgroundColor',[1 1 1]);
hEda=uicontrol(hFig,'Style','edit','Position',[380,250,100,25], .
'BackgroundColor',[1 1 1],'HorizontalAlignraent','left');
hEdb=uicontrol(hFig,'Style','edit','Position',[380,215,100,25],.
'BackgroundColor',[1 1 1],'HorizontalAlignment','left');
hEdc=uicontrol(hFig,'Style','edit','Position', [380,185,100,25] , .
'BackgroundColor',[1 1 1],'HorizontalAlignment','left');
hEdxl=uicontrol(hFig,'Style','edit','Position', [380,110,100,25],
'BackgroundColor', [1 1 1],'HorizontalAlignment','left');
hEdx2=uicontrol(hFig,'Style','edit','Position',[380,75,100,25],.
'BackgroundColor',[1 1 1],'HorizontalAlignment','left');
hBtn=uicontrol(hFig,'Style','pushbutton','String','Решение