Головна

Fieldnames (s) - повертає масив рядків з іменами всіх полів

  1. TextOut Пише зазначений рядок тексту на канві, починаючи з вказаної позиції
  2. Абзаци потрібно робити більш дрібними і відокремлювати один від одного порожнім рядком
  3. Алгоритми обробки одновимірних числових масивів
  4. Асинхронні двигуни з масивним ротором.
  5. Ахист від електромагнітних полів та випромінювань
  6. Бім повертає надію

Структури MATLABа можна назвати агрегованих типом даних. Іншим агрегованих типом даних в системі MATLAB є так звані осередки (cells).


# $ + Масиви осередків.

масив осередків може містити як елементи масиви різних типів! Таким чином, він є універсальним контейнером - його осередки можуть містити будь-які типи і структури даних, з якими працює MATLAB - масиви чисел будь-якої розмірності, рядки, масиви структур та інші (вкладені) масиви осередків. Масив осередків може бути полем структури.

Методи створення масивів осередків схожі на методи створення структур. Як і в випадку структур, масиви осередків можуть бути створені або шляхом послідовного присвоювання значень окремих елементів масиву, або створені цілком за допомогою спеціальної функції cell (). Однак в будь-якому випадку важливо розрізняти осередок (елемент масиву осередків) і її вміст. Осередок - це вміст плюс деяка оболонка (службова структура даних) навколо цього вмісту, що дозволяє зберігати в комірці довільні типи даних будь-якого розміру.

Вираз будь-якого типу даних системи MATLAB можна перетворити в осередок, уклавши його в фігурні дужки. Тоді за допомогою наступних присвоювання і звичайних операцій індексації

MyStruct = struct ( 'field1', [1 2 3], 'field2', 'Hello');

MyCellArray (1, 1) = { 'Bonjour!' };

MyCellArray (1, 2) = {[1 2 3; 4 5 6; 7 8 9]};

MyCellArray (2, 1) = {MyStruct};

MyCellArray (2, 2) = {[9 7 5]};

будується масив осередків 2x2, елементами якого є осередки, які містять відповідно текстовий рядок, числовий масив 3x3, структуру MyStruct і вектор-рядок 1x3. Отже, побудований масив осередків містить різнорідні дані, про що нам і повідомляє система MATLAB при введенні імені такого масиву і натисканні клавіші Enter:

При цьому показується вміст не всіх осередків цього масиву. Більш детальну інформацію можна отримати, викликавши функцію celldisp (MyCellArray):

MyCellArray {1,1} =

Bonjour!

MyCellArray {2,1} =

field1: [1 2 3]

field2: 'Hello'

MyCellArray {1,2} =

1 2 3

4 5 6

7 8 9

MyCellArray {2,2} =

9 7 5

Звідси видно, що для того, щоб підібратися до вмісту комірок, потрібно індексувати масив осередків за допомогою фігурних дужок. При звичайній індексації дужках ми з масиву осередків витягаємо окрему осередок. Нагадуємо ще раз про те, що слід чітко розрізняти саму осередок і її вміст (див. Вище).

Масиви осередків повністю вирішують типову задачу зберігання декількох строкових даних під одним ім'ям. Раніше ми вже формували матриці типу char, кожен рядок яких мала одну і ту ж довжину. Це вочевидь обмежує застосування такого рішення. У разі масиву осередків такого обмеження немає:

cellNames {1} = 'function1';

cellNames {2} = 'func2';

Тут ми продемонстрували застосування фігурних дужок в ролі індексуючих елементів, так що використовувати фігурні дужки в правих частинах операції присвоювання тепер не потрібно (там присутні значення, а не комірки). В результаті під ім'ям масиву cellNames зберігаються дві текстові рядки (можна і більше), доступ до кожної з яких здійснюється за індексом відповідно до синтаксисом масиву осередків. Ось код, який виводить на екран обидві текстові рядки:

disp (cellNames {1}); disp (cellNames {2});

Як і в випадку структур, показане вище поелементне створення масиву осередків неефективно з точки зору продуктивності. Це не створює проблем в повільному інтерактивному режимі роботи, але в програмному режимі цей процес краще попередити викликом функції cell ():

MyCellArray = cell (2, 2);

яка відразу створить масив осередків необхідної розмірності і розміру, причому кожна клітинка буде порожній. Порожні осередки позначаються як {[]}. Потім можна здійснювати раніше розглянуті поелементні привласнення, так як тепер вони не вимагають перебудови структури масиву з кожним новим привласненням.

Вмістом порожній осередки є порожній числовий масив, який, як ми знаємо, позначається []. Щоб видалити деякий діапазон комірок з масиву осередків, потрібно цьому діапазону привласнити значення порожнього масиву []:

MyCellArray (2,:) = [];

Тепер масив осередків MyCellArray має розмір 1x2, так як ми тільки що видалили всю другий рядок масиву.

У масивів осередків є безліч корисних застосувань. Наприклад, за допомогою масиву осередків вирішується завдання організації M-функції, якій можна передати довільно велике число аргументів. Припустимо, потрібно обчислити сумарну довжину заздалегідь невідомого числа вектор-рядків. Це завдання вирішується за допомогою ключових слів varargin і varargout (друге ключове слово використовується, коли M-функція повертає заздалегідь невідоме число вихідних значень).

У визначенні M-функції параметр, через який передається заздалегідь невідоме число вхідних аргументів, потрібно позначити ключовим словом varargin. Їм позначається масив осередків, в який упаковані ці параметри. Функція завжди може дізнатися справжнє число аргументів в цьому параметрі, обчисливши функцію length. Нижче представлений код функції, що обчислює суму квадратів довжин вектор-рядків:

function sumlen = NumLength (varargin)

n = length (varargin);

sumlen = 0;

for k = 1: n sumlen = sumlen + varargin {k} (1) ^ 2 + varargin {k} (2) ^ 2;

End

Якщо аргумент varargin не єдиний в списку параметрів, то він повинен стояти останнім. У розглянутому прикладі за допомогою фігурних дужок, Чорноморське вміст окремої комірки, тобто вектор, а за допомогою подальшої індексації дужках витягаємо першу і другу координати вектора.

При виконанні функції NumLength не потрібно (і можна) упаковувати вхідні числові вектор-рядка в масив осередків, так як MATLAB робить це сам. Досить перерахувати їх в якості фактичних параметрів через кому:

NumLength ([1 2], [3 4])

ans =

Тепер викличемо функцію NumLength з іншим числом параметрів:

NumLength ([1 2], [3 4], [5 6])

ans =

Функція легко обробляє обидва ці випадки.

Використання масивів осередків для передачі M-функцій довільного числа параметрів (або для повернення функцією довільного числа вихідних значень) є єдино возвожно вирішенням проблеми. Існують ще й інші випадки, коли обов'язково потрібно застосування масиву осередків. Про них буде розказано в наступному розділі. А зараз ще згадаємо зручний спосіб замінити список величин, розділених комами, компактним індексним виразом з масивом осередків.

Таким замінником є ??індексний вираз, витягає вміст діапазону комірок з масиву осередків. Для прикладу розглянемо функцію plot (), яка вивчалася нами в розділі, присвяченому побудові графіків функцій. Ця функція в якості параметрів передаються масив значень незалежної змінної, масив значень залежної змінної і текстовий рядок, що управляє зовнішнім виглядом графіка. Для компактності всі ці змінні (масиви) можна упакувати в масив осередків, наприклад,

F (1) = {0: 0.1: pi};

F (2) = {sin (F {1})};

F (3) = { 'bo:'};

Тепер вся інформація, необхідна для побудови графіка функції зосереджена в єдиній змінної F. Побудова графіка функції можна здійснити за допомогою компактного вираження

plot (F {1: 3})

так як операція взяття вмісту діапазону комірок з точки зору системи MATLAB породжує список величин, розділених комами.


# $ + Читання і запис файлів даних.

Раніше були розглянуті MAT-файли, в яких зберігаються змінні з робочою області системи MATLAB. Також були розглянуті M-файли, що зберігають текст M-функцій. Тепер розглянемо файли довільного формату, в яких M-функції можуть записувати, а потім читати власні дані.

Під власними даними ми послідовно розглянемо запис вмісту числових векторів і матриць, текстових рядків, структур і масивів осередків.

Почнемо з числових векторів і матриць. Працювати будемо з так званими бінарними (НЕ текстовими) файлами, які спочатку треба відкрити за допомогою призначеної для цього функцією fopen системи MATLAB:

fid = fopen ( 'назва_пакунка', 'прапор')

де ім'я файлу може передувати повним шляхом до нього (інакше файл повинен розташовуватися в поточному каталозі MATLABа). Другий параметр цієї функції - так званий прапор відкриття файлу, говорить про спосіб подальшої роботи з файлом:

'Rb' - тільки для читання

'Wb' - тільки для запису (попередній вміст втрачається)

Друга буква в цих прикладах говорить про бінарному характері файлів. Можливий ще прапор, що дозволяє як читання, так і запис файлів одночасно ( 'r +'), але ми його тут використовувати не будемо.

Функція fopen повертає числовий ідентифікатор відкритого файлу, який треба використовувати в якості параметра для функцій читання і запису в цей файл. Якщо операція відкриття файлу не вдалася (це можливо як через відсутність файлу, так і через неправильне вказівки шляху до нього на диску), то функція fopen повертає -1.

Завжди слід перевіряти повернення функції fopen:

fid = fopen ( 'имя_файла', 'прапор');

if (fid == -1)

error ( 'File is not opened')

End

Після того, як файл більше не потрібно, його слід закрити функцією fclose:



MyStruct1 (1) .data (1, 2) | Fclose (fid1);

Colormap (copper) | Shading interp | Meshz (X, Y, Z) | Image (X); | Image (X1); colormap (map1); | Image (X1); colormap (map1); | Програмування М-функцій. | По перше, | Help імя_M-функції | Disp (message); |

© um.co.ua - учбові матеріали та реферати