Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Красавин Компютерныы практикум в среде МатЛаб 2015

.pdf
Скачиваний:
121
Добавлен:
12.11.2022
Размер:
9.22 Mб
Скачать

%

% [w, NC] = point(px,py,[x1,y1,R1],[x2,y2,R2],...)

%NC равно числу кругов, содержащих точку

%[w, NC, Nums] = point(px,py,[x1,y1,R1],[x2,y2,R2],...)

%Вектор Nums содержит номера кругов, в которые попала точка

%Выделение координат точки из первых двух ячеек

Xpoint = varargin{1};

Ypoint = varargin{2};

%Нахождение числа заданных кругов

%(число ячеек varargin без первых двух) Ncircle = length(varargin) - 2;

%Извлечение координат центров и радиусов кругов for i = 1 : Ncircle

Xcircle(i) = varargin{i+2}(1); Ycircle(i) = varargin{i+2}(2); Rcircle(i) = varargin{i+2}(3);

end

%Полагаем w = 0, т. е. пока нет ни одного нужного круга w = 0;

%Полагаем NC = 0

NC = 0;

% Перебор кругов в цикле for i = 1:Ncircle

%Вычисление расстояния от точки до центра текущего круга dist = sqrt((Xpoint-Xcircle(i))^2+(Ypoint-Ycircle(i))^2);

%Сравнение расстояния с радиусом круга

if dist <= Rcircle(i)

w = 1; % Требуемый круг найден

% Увеличение числа найденных кругов на единицу

NC = NC + 1;

% Сохранение номера круга

Nums(NC) = i;

end

end

% Запись результатов в выходной массив ячеек в зависимости от числа % выходных параметров

if nargout == 2 varargout{1} = NC;

131

elseif nargout == 3 varargout{1} = NC; varargout{2} = Nums;

end

%Отображение данных в графическое окно figure;

%Построение окружностей

t = 0:pi/20:2*pi; % задание вектора параметра for i = 1:Ncircle

%Вычисление векторов, соответствующих параметрически

%заданным функциям, которые определяют окружности

x= Rcircle(i)*cos(t) + Xcircle(i);

y= Rcircle(i)*sin(t) + Ycircle(i);

plot(x,y) % построение окружности hold on

end

% Вывод точки красным маркером plot(Xpoint,Ypoint, 'or')

hold off

axis square % сохранение одинакового масштаба осей

Задания

10.1.Написать анонимную функцию, вычисляющую значение гиперболического синуса аргумента.

10.2.Написать анонимную функцию, получающую на вход два вектора одинаковой длины ݔ и ݕ, а также дескриптор для построения графика. Функция должна строить нужный тип

графика зависимости ݕ от x, например:

fun(x,y,@bar)

10.3. Написать функцию, предусматривающую различное число входных параметров: длину, ширину и глубину. Если введены только два первых параметра, функция должна возвратить площадь прямоугольника, если введены все три параметра – объем прямоугольного параллелепипеда и площадь прямоугольника его основания.

132

11

Массивы ячеек

11.1. Создание массива ячеек

В MatLab существует тип данных, который отсутствует в большинстве языков программирования, – массив ячеек. Массив ячеек является массивом, однако в отличие от обычных векторов и матриц элементы массива ячеек могут содержать переменные различных типов.

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

cellrowvec = {23, 'a', 1:2:9, 'hello'} % задание массива ячеек в виде вектор-строки

cellrowvec =

[23] 'a' [1x5 double] 'hello'

Массив ячеек также можно задать в виде столбца или матрицы:

cellcolvec = {23; 'a'; 1:2:9; 'hello'} % задание массива ячеек в виде вектор-столбца

cellcolvec =

[23]

'a'

[1x5 double] 'hello'

133

cellmat = {23 'a'; 1:2:9 'hello'} % задание массива ячеек в виде вектор-столбца

cellmat =

23]

'a'

[

[1x5 double]

'hello'

В MatLab тип данных массив ячеек имеет название cell:

class(cellmat) % выяснение типа переменной cellmat ans =

cell

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

mycellmat = cell(2,2) % создание массива ячеек нужной размерности; ячейки создаются пустыми

mycellmat = [] [] [] []

11.2. Отображение и вызов элементов и атрибутов ячеек

Существует два вида вызова элементов массива ячеек: вызов ячейки и вызов содержимого ячейки.

При использовании фигурных скобок для индексов вызывается содержимое ячейки, такой способ обращения называется

индексированием содержимого ячейки. Например:

cellrowvec{2} ans =

134

a

class(ans) выяснение типа переменной ans, в которую был записан результат выполнения предыдущей команды

ans =

char % тип переменной ans - символ

Аналогично происходит обращение к содержимому ячеек, входящих в структуру матрицы:

cellmat{1,1} ans =

23

Присвоение значений элементам массива ячеек также аналогично операции присвоения значений для элементов матриц и векторов; например, для массива mycellmat, инициализированного в п. 11.1, присвоение значения 23 элементу в первой строке и в первом столбце производится следующим образом:

mycellmat{1,1} = 23

 

mycellmat =

[]

[23]

[]

[]

При использовании круглых скобок происходит обращение к ячейке; такой способ обращения называется индексированием ячейки. Например,

cellcolvec(2) ans =

'a'

class(ans) % выяснение типа переменной ans, в которую был записан результат выполнения предыдущей команды

ans =

135

cell % тип переменной ans - ячейка

Если вызываемая ячейка сама является структурой, то при индексировании ячейки отобразится только тип этой структуры; сам объект может быть отображен при индексировании содержимого ячейки:

cellmat(2,1) ans =

[1x5 double] % в этой ячейке содержится вектор длины 5

cellmat{2,1} % эта команда позволяет отобразить содержимое вектора

ans =

1 3 5 7 9

cellmat{2,1}(4) % конкретный элемент этого вектора может быть вызван при помощи круглых скобок

ans =

7

Существует несколько способов отображения массива ячеек. Функция celldisp отображает содержимое всех элементов в массиве ячеек:

celldisp(cellrowvec)

cellrowvec{1} = 23

cellrowvec{2} = a cellrowvec{3} =

1 3 5 7 9 cellrowvec{4} =

hello

136

Функция cellplot отображает массив ячеек в графическом окне, однако этот способ не отображает содержимое массивов, а лишь их структуру (рис. 11.1).

Рис. 11.1. Отображение массива ячеек при помощи функции cellplot

Многие функции и операторы, которые могут применяться к векторам и матрицам, применимы и к массивам ячеек:

length(cellrowvec) % длина массива cellrowvec ans =

4

size(cellcolvec) % размер массива cellcolvec ans =

4

1

последний

элемент

массива

cellrowvec{end}

%

cellrowvec

 

 

 

 

ans =

 

 

 

 

hello

 

 

 

 

 

 

137

 

 

Для удаления элемента из массива ячеек используется индексирование по ячейкам:

cellrowvec

[23]'a' [1x5 double] 'hello'

cellrowvec(2) = [] % удаление второго элемента

cellrowvec =

[1x5 double]

'hello'

[23]

11.3. Хранение строк в массиве ячеек

Одним из самых полезных применений массивов ячеек является возможность хранения строк различной длины:

names = {'Андрей', 'Антон', 'Александр'}

names =

'Андрей' 'Антон' 'Александр'

Каждая из строк имеет свою длину и не содержит лишних пробелов. Длину каждой строки можно отобразить с помощью поэлементного цикла for:

for i = 1 : length(names) disp(length(names{i}))

end

6

5

9

При помощи функции cellstr массив символов может быть конвертирован в массив ячеек, при этом лишние пробелы игнорируются:

138

greetman = char('Hello','Goodbye') % создание символьного массива

greetman =

Hello

Goodbye

size(greetman)

ans =

2 7 % первая строка дополнена двумя пробелами для того, чтобы все строки в символьном массиве были одной длины

cellgreets = cellstr(greetman) % преобразование символьного массива в массив ячеек

cellgreets =

'Hello'

'Goodbye'

size(cellgreets{1})

ans =

1 5 % первый элемент имеет длину 5

Задания

11.1. Написать программу, которая инициализирует три массива ячеек, первый из которых содержит несколько имен (Андрей, Егор, Алексей и т.п.), второй – несколько глаголов (ест, любит, видит и т.п.), третий – несколько существительных (яблоки, камни, книги и т.п.), а затем случайным образом выбирает из каждого массива ячеек по одному элементу и выводит получившееся предложение на экран.

139

11.2. Написать функцию buildstr, которая имеет два входных

аргумента: символ и целое положительное

число

. Функция

должна создать и выдать на экран массив из

ячеек,

каждая из

которых содержит строку длиной от 1 до , при этом первая ячейка содержит строку, совпадающую со входным символом, а каждая следующая строка получается из предыдущей присоединением символа, ASCII-код которого на единицу больше ASCII-кода предыдущего символа. Например:

buildstr('щ',3)

ans =

'щ' 'щъ' 'щъы'

ASCII-код символа может быть определен при помощи функции double:

double('щ')

ans =

1097

140

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]