Применение MATLAB для моделирования радиотехнических сигналов и устройств. Учебно-методическое пособие
.pdfa(начальный_индекс : конечный_индекс)
|
|
|
|
a(1,2:4) |
|
|
a(1:end,3) |
ans = |
|
|
ans = |
2 |
3 |
4 |
3 |
|
|
|
7 |
|
|
|
11 |
a(2:3,2:4) |
|
|
|
ans = |
|
|
|
6 |
7 |
8 |
|
10 |
11 |
12 |
|
Если применять двоеточие без указания начального и конечного индексов, произойдет обращение ко всем элементам в указанном измерении массива:
a(2,:) ans =
5 |
6 |
7 |
8 |
Можно также обратиться к группе элементов, перебирая индексы с заданным шагом:
a(начальный_индекс : шаг : конечный_индекс)
Например, создадим массив a =[1 2 3 4 5 6 7 8 9]. Для
считывания элементов вектора с первого по последний с шагом равным двум необходимо записать:
a(1:2:end) ans =
1 |
3 |
5 |
7 |
9 |
Если можно обратиться к элементам, значит, можно и заменить их в исходном массиве:
a(1:2:end)=0 a =
0 |
2 |
0 |
4 |
0 |
6 |
0 |
8 |
0 |
11
При перезаписи значений из одного массива в другой важно учитывать, чтобы размерности массивов совпадали:
a(1:2:end)=[-5 -4 -3 -2 -1] a =
-5 |
2 |
-4 |
4 |
-3 |
6 |
-2 |
8 |
-1 |
С помощью оператора «двоеточие» можно также создавать векторы из элементов, идущих с равным шагом:
v=0:0.5:2 v =
0 |
0.5000 |
1.0000 |
1.5000 |
2.0000 |
Если не указать шаг, по умолчанию он будет равен единице:
v=0:8 v =
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
3.3. Операции с массивами и векторами
Рассмотрим особенности работы с массивами в языке программирования MATLAB. Как уже говорилось, в MATLAB нет понятия отдельной переменной, все переменные – массивы.
Если применять арифметический оператор или функцию к такой переменной-массиву, то MatLab осуществляет поэлементную обработку всех элементов массива.
Примечание. Оператором (англ. operator) называют специальное обозначение для определенной операции над данными – операндами (англ. operand) [3].
Для примера создадим массив:
a=[1 2; 3 4] a =
1 |
2 |
3 |
4 |
12
Ниже представлены примеры операций.
|
|
|
|
b=a-1 |
|
b=a-2*a |
|
b = |
|
b = |
|
0 |
1 |
-1 |
-2 |
2 |
3 |
-3 |
-4 |
c=log(a) |
|
c=sqrt(a) |
|
c = |
|
c = |
|
0 |
0.6931 |
1.0000 |
1.4142 |
1.0986 |
1.3863 |
1.7321 |
2.0000 |
Чтобы отличать поэлементные (англ. element-wise) операции умножения, деления и возведения в степень от матричных, они записываются с помощью операторов «.*», «./», «.^» соответственно:
|
|
|
||
Поэлементные |
Матричные |
|
||
b=a.*a |
|
b=a*a |
|
|
b = |
|
b = |
|
|
1 |
4 |
7 |
10 |
|
9 |
16 |
15 |
22 |
|
b=a./a |
|
b=a/a |
|
|
b = |
|
b = |
|
|
1 |
1 |
|
||
1 |
0 |
|||
1 |
1 |
|||
|
|
0 |
1 |
|
b=a.^2 |
|
b=a^2 |
|
|
b = |
|
b = |
|
|
1 |
4 |
7 |
10 |
|
9 |
16 |
15 |
22 |
|
|
|
|
|
|
b=a.^a |
|
|
|
|
b = |
|
|
|
|
1 |
4 |
|
|
|
27 |
256 |
|
|
|
Возможно объединение (англ. concatenation) двух и более массивов в один. При этом можно их объединить как по горизонтальной, так и
13
по вертикальной линии: в первом случае необходимо, чтобы у матриц было одинаковое количество строк, а во втором – столбцов:
|
|
|
||
a=[1 2; 3 4]; |
a=[1 2; 3 4]; |
|
||
b=[5 6]; |
|
b=[5;6]; |
|
|
c=[a;b] |
|
c=[a,b] |
|
|
c = |
|
c = |
|
|
1 |
2 |
1 |
2 |
5 |
3 |
4 |
3 |
4 |
6 |
5 |
6 |
|
|
|
4. M-ФАЙЛЫ
Несмотря на весь спектр возможностей MATLAB, доступный через командное окно, использовать последнее для написания скольконибудь сложной программы неудобно. Для хранения кода программы, его отладки и возможности многократного использования предназначены m-файлы.
Использование m-файлов можно разделить на два вида.
1. Скрипт (англ. script) представляет собой m-файл, где записана последовательность команд, как если бы они вводились в командном окне. Эти команды образуют простейший тип программы на языке MATLAB, выполнямой при вызове m-файла. Переменные, созданные в скрипте, сохраняются в рабочей области MATLAB.
2. M-функция – отдельная программная единица, которая может иметь входные, выходные параметры, а также свои локальные переменные (см. «Создание функций»).
Для создания нового m-файла есть несколько следующих способов. 1. Нажать «New Script» (см. рис. 1) в главном окне среды. При этом откроется редактор (англ. Editor), введенные команды в котором мож-
но сохранить в m-файле (рис. 2).
2.Выделить в «Command History» команды, щелкнуть на них правой кнопкой мыши и выбрать «Create Script». В результате выделенные команды будут скопированы и открыты в редакторе (Editor), далее их можно также сохранить в m-файле.
3.Ввести в «Command Window» команду edit имя_файла, где
имя_файла (m-файла) должно начинаться с буквы и содержать только буквы английского алфавита, цифры и символы подчеркивания «_».
При вводе edit без указания имени файла создается файл Untitled.m, однако надо иметь в виду, что автоматически Untitled.m MATLAB не сохраняет.
14
Рис. 2. Окно редактора m-файлов
Команда edit, кроме создания m-файлов, предназначена также для их открытия в редакторе (Editor).
Текст имя_файла может содержать только имя, в этом случае но-
вый файл создается в текущей папке (англ. Current Folder). Если там уже есть файл с таким именем, он откроется для редактирования.
Если имя_файла кроме имени содержит путь, например, введено edit D:\new_file.m, то файл создается в указанном месте, или, если таковой уже существует, он открывается для редактирования.
5. ОСОБЕННОСТИ СИНТАКСИСА ЯЗЫКА MATLAB
5.1. Условный оператор «if … elseif … else»
Общий вид конструкции условного оператора if имеет вид:
if условие операторы;
elseif условие операторы;
...
else
операторы;
end
15
В простейшем виде он выглядит как
if условие операторы;
end
Если условие, записанное после if, истинно, то выполняется блок стоящих следом за ним операторов. Истинным является такое условие, которое возвращает логическое значение 1. Переход к проверке условий следующих блоков elseif осуществляется, только если предыдущие оказались ложными. Блок else («иначе», «в противном случае») должен быть один, блоков elseif напротив, может быть много.
В табл. 1 и 2 приведено принятое в MATLAB обозначение операторов отношения (англ. relational operators) и логических операторов.
|
|
Таблица 1 |
|
Операторы отношения |
|
|
|
|
Форма записи |
Эквивалентная форма |
Описание |
== |
eq(A,B) |
Равно |
~= |
ne(A,B) |
Не равно |
> |
gt(A,B) |
Больше |
< |
lt(A,B) |
Меньше |
>= |
ge(A,B) |
Больше или равно |
<= |
le(A,B) |
Меньше или равно |
isequal(A,B) |
|
Определение равенства масси- |
|
|
вов. Если массивы A и B имеют |
|
|
одинаковый размер и содержа- |
|
|
ние, функция возвращает логи- |
|
|
ческую единицу (истина), в про- |
|
|
тивном случае – логический ноль |
|
|
(ложь) |
isequaln(A,B) |
В отличие от оператора ise- |
|
|
|
qual(A,B) этот оператор рас- |
|
|
сматривает неопределенные зна- |
|
|
чения (NaN2) соответствующих |
|
|
друг другу элементов массивов А |
|
|
и B как равные |
2 Not-a-Number.
16
|
|
Таблица 2 |
|
Логические операторы |
|
|
|
|
Форма записи |
Эквивалентная форма |
Описание |
& |
and(A,B) |
Логическое И |
| |
or(A,B) |
Логическое ИЛИ |
~ |
not(A) |
Логическое НЕ |
xor(A,B) |
|
Исключающее ИЛИ |
Примечание. Возможно (и MATLAB рекомендует) применение укороченных (англ. short-circuit) логических операторов && и ||. С их помощью реализуется укороченная проверка логических выражений. Например, в случае A&&B, если A дает логический ноль (ложь), то проверка B уже не осуществляется, поскольку результат тождественно ложен. Также и в случае A||B: если A дает логическую единицу (истина), то B не проверяется, так как выражение заведомо истинное [3, 7].
Пример. Пороговая обработка массива:
|
|
|
|
|
A=rand(4,3) |
A = |
|
0.8143 |
0.1966 |
for i=1:4 |
0.1493 |
|
||
for j=1:3 |
0.2575 |
|
0.2435 |
0.2511 |
if A(i,j)<0.5 |
0.8407 |
|
0.9293 |
0.6160 |
A(i,j)=0; |
0.2543 |
|
0.3500 |
0.4733 |
elseA(i,j)=1; |
A = |
1 |
0 |
|
end; |
0 |
|
||
end; |
0 |
0 |
0 |
|
end; |
1 |
1 |
1 |
|
A |
0 |
0 |
0 |
|
5.2. Применение операторов отношения к матрицам
Применение операторов отношения и логических операторов в языке MATLAB распространяется не только на переменные, которые, напомним, являются в простейшем случае массивами размерностью 1×1, но также и на массивы с большей размерностью.
Все операторы отношения (см. табл. 1) применимы для многомерных массивов. Для этого размеры массивов, элементы которых сравниваются, должны быть одинаковы или совместимы3.
3 Применение операторов отношения к массивам с совместимыми размерами (англ. compatible sizes) реализовано в поздних версиях MATLAB, на-
пример, в 2016b [8].
17
При применении операторов отношения к двум массивам одинакового размера MATLAB осуществляет поэлементное сравнение, результатом которого является логический массив с таким же размером. Этот массив содержит единицы и нули, соответствующие элементам, для которых логическое условие или выполняется (единица) или не выполняется (ноль).
Например:
|
|
|
|
|
||
A=[1 2 3; 2 4 5]; |
|
C=A==B |
|
|
||
B=[1 10 3; 2 |
4 5]; |
C = |
|
|
||
C=B>A |
|
|
|
1 |
0 |
1 |
C = |
|
|
|
|||
0 |
1 |
|
0 |
1 |
1 |
1 |
0 |
0 |
|
0 |
|
|
|
При сравнении массива и числа происходит сравнение с каждым элементом массива:
A=[1 2 3; 2 4 5];
C=A>2
C =
0 |
0 |
1 |
0 |
1 |
1 |
Результирующий логический массив можно использовать для определения значений массива, удовлетворяющих заданному условию. Для этого необходимо указать полученный логический массив в качестве индекса:
A(C) ans =
4
3
5
Тот же самый результат можно получить и без промежуточного массива:
A(A>2) ans =
4
3
5
18
Используя этот инструментарий, можно не только находить, но и заменять элементы массива:
A(A>2)=0 A =
1 |
2 |
0 |
2 |
0 |
0 |
Для определения индексов элементов подходит функция find.
Сама по себе она позволяет определить значения и индексы ненулевых элементов массива [9], однако вкупе с логическими операторами позволяет найти индексы элементов, удовлетворяющих заданному условию.
Например, найдем индексы массива A:
|
|
|
|||
>> A=[1 2 3; 2 4 5] |
>> A<2 | A>2 |
|
|||
A = |
|
|
ans = |
|
|
1 |
2 |
3 |
1 |
0 |
1 |
2 |
4 |
5 |
0 |
1 |
1 |
>> i=find(A<2 | A>2) |
>> [row col]=find(A==2) |
||||
i = |
|
|
row = |
|
|
1 |
|
|
2 |
|
|
4 |
|
|
1 |
|
|
5 |
|
|
|
|
|
6 |
|
|
col = |
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
2 |
|
|
5.3.Циклы типа «for»
Вобщем виде цикл «for» записывается как
for index = значения операторы;
end
19
Данная конструкция выполняет группу операторов внутри цикла (тело цикла) заданное количество раз при изменении переменной index. Наиболее распространенная запись для задания приращения зна-
чения index = исходное_значение:шаг:конечное_значение.
В случае, если шаг равен 1, запись можно сократить до исход-
ное_значение:конечное_значение.
Примеры
Заполнение вектора A значениями от 1 до 5:
|
|
|
|
|
|
A=zeros(1,5) |
A = |
0 |
0 |
0 |
0 |
for i=1:5 |
0 |
||||
A(i)=i; |
A = |
|
|
|
|
end |
2 |
3 |
4 |
5 |
|
A |
1 |
Вычисление значений функции при изменении аргумента в заданных пределах:
|
|
for x=1:-0.5:-1 |
y = 1 |
y=x^3 |
y = 0.1250 |
end |
y = 0 |
|
y = -0.1250 |
|
y = -1 |
Значения index можно задать также вектором и даже матрицей:
|
|
|
for x=[-1 2 |
0 -2] |
y = -1 |
y=x^3 |
|
y = 8 |
end |
|
y = 0 |
|
|
y = -8 |
for i=[1 2; |
3 4] |
1 |
disp(i); |
|
3 |
end |
|
2 |
|
|
|
|
|
4 |
20
