В каждом столбце найти минимум




Лекция 2 (3)

Операторы цикла и условные операторы

Программа может иметь комментарии. Символ %означает, что далее следует поясняющий текст. Все комментарии начинаются с этого знака. Комментарий не является исполняемым оператором.

Вывод комментариев на экран при выполнении программы обеспечивает оператор echo on. Отменяет вывод комментариев на экран оператор echo off. Оператор pause приостанавливает выполнение программы и ожидает нажатия любой клавиши для продолжения. Оператор pause(n) создает паузу в n секунд.

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

Язык ML имеет специальные управляющие конструкции, которые позволяют задавать последовательность выполнения команд в программах. Такие конструкции называются операторами управления и задаются с помощью ключевых слов. Это условный оператор if и оператор переключения (выбора) switch…case и операторы цикла for и while.

Изображение ветвления в виде блок-схемы выглядит следующим образом: (полное ветвление если-то-иначе, и неполный вариант ветвления если-то).

Бл-сх.

Условный оператор позволяет организовать ветвления в программе и имеет следующую синтаксическую конструкцию:

if (<логическое выражение1>)

<операторы>

Else

<операторы>

End

Синтаксис и выполняемые действия этих операторов аналогичны соответствующим операторам известных языков программирования. Область действия конструкции ограничивается словом end.

Условный оператор м ожет содержать ветку elseif и иметь такой вид:

if (<логическое выражение1>)

<операторы>

[elseif (<логическое выражение2>)

<операторы>

elseif (<логическое выражение3>)

<операторы>

…]

[else

<операторы>]

End

В этой конструкции может быть произвольное количество вложений ветвей elseif, или их может не быть вовсе.

MATLAB допускает вложенность операторов. Условный оператор может быть вложенным. Тогда каждому if может соответствовать свой end.

if (<логическое выражение1>)

<операторы>

[else

if (<логическое выражение2>)

<операторы>

[else

<операторы>]

End

End

Пример

a=input('введите a=');

b=input('введите b=');

%disp(sprintf('исходные данные:при a=%3.1f; при b=%3.1f',a,b))

if a>10

res=a-b;

elseif a>0&a<=10&b<0

res=a+b;

else

res=2*b;

end

disp(sprintf('исходные данные:при a=%3.1f; при %b=%3.1f\nres=%3.1f',a,b,res))

%disp(sprintf('f=%3.1f',res))

disp(res)

Найти максимум из 3-х чисел x, y, z

x=input('bb x= ');

y=input('bb y= ');

z=input('bb z= ');

if (x>y)&(x>z)

max=x

elseif (y>z)

max=y

else

max=z

end

Disp(max)

Оператор выбора

 

Оператор переключения (выбора). Если необходимо сделать множественный выбор, можно воспользоваться оператором переключения, синтаксическая конструкция которого приведена ниже:

Switch <ключевое выражение>

Case { <список значений1}

<операторы>

Case {<список значений2>}

<операторы>

…….

[Otherwise

<операторы>]

End

Сначала вычисляется значение ключевого выражения. Затем это значение ищется в списках значений. Если совпадение найдено, то выполняются операторы соответствующего блока, в противном случае выполняются операторы, стоящие после ключевого слова otherwise.

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

n=input('введи номер месяца: ')

switch n

case {1,2,12}

s='зима';

case {3,4,5}

s='весна';

case {6,7,8}

s='лето';

case {9,10,11}

s='осень';

otherwise

s='ошибка';

end

disp(strcat('введенный номер месяца - ',s))

 

Циклы

Напомним:

Цикл – это многократно повторение одинаковых действий с различными исходными значениями. Однократное выполнение совокупности действий в цикле называется итерацией цикла. Операторы и конструкции, которые выполняются в цикле, называется телом цикла.

Различают 2 вида циклов: арифметические и итерационные. Цикл называют арифметическим, если количество повторений заранее известно или может быть вычислено. Если количество повторений заранее неизвестно, то такой цикл называют итерационным.

В Матлабе различают циклические структуры: цикл «ДЛЯ», цикл «ПОКА». Это for и while соответственно.

Обычно, когда необходимо выполнять тело цикла для различных значений некоторой переменной в заданном диапазоне, удобно использовать конструкцию «ДЛЯ». В заголовке такого цикла указывается и начальное значение, и шаг, и конечное значение переменной. В остальных случаях используют конструкцию «ПОКА». В цикле «ПОКА» сначала, до выполнения тела цикла, проверяется условие, поэтому цикл может не выполниться ни одного раза. При использовании этого вида цикла обязательно до цикла надо указать начальное значение переменной, которая будет изменяться в цикле. Кроме того всегда внутри цикла должен быть оператор, изменяющий условие.

Возможны варианты, когда внутри одного цикла необходимо повторить некоторую совокупность действий, т.е. организовать еще один цикл (внутренний цикл). Такая структура называется вложенным циклом или циклом в цикле.

Оператор цикла с параметром позволяет описывать действия, которые выполняются фиксированное количество раз:

For <пар. цикла>=<нач. значение>:<шаг>:<кон. значение>

<операторы>

End

Для досрочного прерывания цикла используется оператор break.

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

Например, требуется вычислить значения у=x2 для всех х на отрезке от 1 до 10 c шагом равным 3:

>>for x=1:3:10 1:2:10

y=x^2

end

Результат выполнения данного оператора:

y =

y =

y =

y =

Или вычислим значения у для всех х на отрезке от 0 до 1.5
c шагом равным 0,5:

for x=0:0.5:1.5

y=x^2;

disp(strcat('x=',num2str(x),' y=',num2str(y)))

end

В результате на экране получим:

x=0 y=0

x=0.5 y=0.25

x=1 y=1

x=1.5 y=2.25

Вычислить сумму

Дано натуральное n. Вычислить значение суммы

s=0;

n=input('введите n=');

for i=1:n

s=s+1/i^2;

end

disp(strcat('s=', num2str(s)))

Вычислить значение произведения:

p = 1;

a = 1;

for i = 1:11

x=x/i;

p=p*(1+x);

end

disp(p)

Оператор цикла с предусловием while позволяет запрограммировать цикл, в котором количество повторений зависит от выполнения некоторого условия:

while <лог. выражение, задающее усл. продол. цикла>

<операторы>

End

Например, найти целое х, при котором ax больше заданного B.

a=input('введи a=');

b=input('введи b=');

x=0;

sta=1;

while sta <b

x=x+1;

sta=sta*a;

end

disp(x)

Получим на экране:

введи a=2

введи b=45

Пример.

Вычислить за сколько лет в сбербанке будет накоплена сумма S при начальном вкладе W и процентах годового прироста P.

K – число лет.

D – прирост за год.

D=w*p/100

W=w+d

k=0;

p=10;

s=1000;

w=800;

while w<s

d=w*p/100;

w=w+d;

k=k+1;

end

disp(strcat('s=',num2str(s),' k=',num2str(k),' w=',num2str(w)))

На экране получим:

s=1000 k=3 w=1064.8

Массивы

Как уже упоминали, все данные в системе Матлаб представляют собой массив. Это особенность системы. Матлаб предоставляет пользователю специальные возможности (матричные операции) для работы с массивами (векторами и матрицами). Однако пока мы будем рассматривать возможность поэлементной обработки (как в любом ЯВУ).

Массив – это упорядоченная совокупность данных одного типа, расположенных в памяти компьютера последовательно в порядке возрастания порядковых индексов (номеров).

Любой массив характеризуется именем, числом измерений (размерностью), размером, и типом элементов.

Размерность массива, или число измерений, определяет количество индексов необходимых для однозначного доступа к элементам массива. Число индексов характеризует размерность массива.

Размер массива соответствует количеству элементов по каждому измерению.

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

В массиве под одним именем хранится множество однотипных значений.

Каждый элемент массива имеет номер или индекс, определяющий его местоположение в массиве.

Доступ к элементу массива осуществляется указанием имени массива и в круглых скобках индекса. В качестве индекса массива может использоваться целочисленная переменная, константа или выражение (B(k), A(5), X(i+2), Y(3, 4)).

Нумерация элементов начинается с 1, т.е. индексы должны быть >=1.

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

В одномерном массиве расположение элемента определяется одним индексом (A (2)). В матрице (двумерном массиве) каждому элементу соответствует два индекса. Первый индекс - это номер строки, а второй - номер столбца, где расположен элемент матрицы.

Чтобы обратиться к элементу матрицы, достаточно указать имя матрицы и в скобках через запятую индексы (номера) строки и столбца. Например, запись Х (2, 3) означает обращение к элементу матрицы Х, расположенному во 2-й строке 3-го столбца.

На текущий момент ввод любого массива одномерного и матрицы будем осуществлять в цикле (не учитываем пока возможности Матлаба). А как ещё? Вывод массивов в цикле, как мы увидим, в Матлабе выглядит некрасиво. Командой disp(<имя>) массив выводится автоматически в удобном для восприятия виде. Рассмотрим отдельно одномерные массивы и матрицы.

Одномерные массивы

Например, ввод и вывод массива можно организовать так:

n=input('введите n=');

for i=1:n

X(i)=input('X(i)=');

end

Вывод массива

Использовали для вывода цикл

for i=1:n

disp(X(i));

end

На экране:

введите n=4

X(i)=2

X(i)=3

X(i)=4

X(i)=5

Получили на экране при таком выводе:

Некрасиво! Так массив не надо выводить, ввод тоже неинформативен, не пронумерованы элементы.

Используем другой вариант:

clear;

n=input('введите n=');

for i=1:n

disp(sprintf('X(%g)=',i))

X(i)= input(' ');

end

disp('Массив X')

disp(X)

 

На экране увидим:

введите n=3

X(1)=

X(2)=

X(3)=

Массив X

2 5 8

Пока мы не знаем операций и функций ML для работы с массивами и матрицами, обработку массивов будем осуществлять в цикле.

Пример

Вычислить среднее арифметическое значение положительных элементов в массиве.

clear;

n=input('Введите n=');

for i=1:n

disp(sprintf('X(%g)=',i))

X(i)= input(' ');

end

s=0;

k=0;

for i=1:n

if X(i)>0

s=s+X(i);

k=k+1;

end

end

sr=s/k;

disp(‘sr=’);

disp(sr);

На экране:

Введите n=3

X(1)=

X(2)=

-1

X(3)=

sr=

3.5000

Пример

%заменить мин в массиве на число в

n=input('Введите n = ');

b=input('Введите b = ');

for i=1:n

x(i)=input('x(i)=');

end

disp('исходный массив');

disp(x);

min=x(1);

pmin=1;

for i=2:n

if x(i)<min

min=x(i);

pmin=i;

end

end

x(pmin)=b;

disp('полученный массив');

disp(x);

 

Пример

Сформировать новый массив из элементов кратных 5

clear;

n=input('Введите n=');

for i=1:n

disp(sprintf('X(%g)=',i))

X(i)= input('');

end

disp('isx mas');

disp(X);

k=0;

for i=1:n

if mod(X(i),5)==0

k=k+1;

Y(k)=X(i);

end

end

disp('new mas');

disp(Y);

 

Матрицы

В двумерном массиве каждому элементу соответствует два индекса. Первый индекс - это номер строки, а второй - номер столбца, где расположен элемент матрицы.

Чтобы обратиться к элементу двумерного массива, достаточно указать имя матрицы и в скобках через запятую индексы (номера) строки и столбца. Например, запись А(2, 3) означает обращение к элементу 2-й строки 3-го столбца.

Для поэлементного ввода и обработки двумерных массивов используют вложенные циклы.

Ввод матрицы можно осуществить следующими способами:

1-й вариант

Этот вариант аналогичен 1-му примеру с одномерным массивом. Ввод осуществим построчно, но элементы матрицы при вводе не пронумерованы. Матрицу выведем традиционным для ML способом.

clear;

n=input('Введите n=');

m=input('Введите m=');

for i=1:n

disp(sprintf('Введите эл. %d строки матрицы',i))

for j=1:m

X(i,j)=input('X(i,j)=');

end

end

disp('Матрица X');

disp(X);

 

На экране получим:

Введите n=2

Введите m=3

Введите эл. 1 строки матрицы

X(i,j)=4

X(i,j)=5

X(i,j)=6

Введите эл. 2 строки матрицы

X(i,j)=1

X(i,j)=2

X(i,j)=3

Матрица X

4 5 6

1 2 3

2-ой вариант

clear;

n=input('Введите n=');

m=input('Введите m=');

for i=1:n

for j=1:m

disp(sprintf('Введите %s(%d,%d)=','X',i,j))

X(i,j)= input(' ');

end

end

disp('Матрица X');

disp(X);

 

Получим:

Введите n=2

Введите m=3

Введите X(1,1)=

Введите X(1,2)=

Введите X(1,3)=

Введите X(2,1)=

Введите X(2,2)=

Введите X(2,3)=

Матрица X

4 3 7

4 9 1

 

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

Пример

Определить среднее арифметическое отрицательных элементов в матрице. Если их нет, выдать сообщение.

n=input('введите n=');

m=input('введите m=');

disp('введите эл. матрицы');

for i=1:n

for j=1:m

X(i,j)=input('X(i,j)=');

end

end

disp('исходная матрица')

disp(X)

s=0;

k=0;

for i=1:n

for j=1:m

if X(i,j)< 0

k=k+1;

s=s+X(i,j);

end

end

end

if s==0

disp('Отрицательных нет');

else

sr=s/k;

disp('sr=');

disp(sr);

end

Пример

В каждом столбце найти минимум

n=input('введите n=');

m=input('введите m=');

disp('введите эл. матрицы');

for i=1:n

for j=1:m

X(i,j)=input('X(i,j)=');

end

end

disp('исходная матрица')

disp(X)

for j=1:m

minX=X(1,j);

for i=1:n

if X(i,j)< minX

minX=X(i,j);

end

end

disp(sprintf('мин.зн. %2d столбца=%5.3f', j,minX))

end

Пример

В каждой строке найти количество элементов X<=A(i,j)<=Y

x=input('введите x=');

y=input('введите y=');

n=input('введите n=');

m=input('введите m=');

disp('введите эл. матрицы');

for i=1:n

for j=1:m

A(i,j)=input('A(i,j)=');

end

end

disp('исходная матрица')

disp(A)

for i=1:n

k=0;

for j=1:m

if A(i,j)>=x && A(i,j)<=y

k=k+1;

end

end

disp(sprintf('в строке № %2d количество эл.=%2d', i,k))

end

 

Матричные операции

Как уже говорилось, в MLможно не только выполнять обычные арифметические операции над числами и вычислять значения функций, но и производить операции над векторами и матрицами. Все арифметические операции являются “матричными” и осуществляются по правилам линейной алгебры. Примеры

В ML возможно выполнять операции поэлементного преобразования и использовать операции, соответствующие правилам векторного исчисления.

Векторы можно использовать как аргументы математических функций. Например, sin(X). Результатом будет вектор, элементы которого будут равны значению sin соответствующего элемента исходного вектора. Функции от векторов вычисляются поэлементно.

Также можно выполнять с векторами поэлементные операции. Эти операции могут выполняться только над векторами одинакового размера и типа.

Добавим операции к уже известным.

К арифметическим операциям следует добавить транспонирование (‘) Обратное деление?.

Тогда приоритеты АО:

· возведение в степень, транспонирование;

· умножение, деление;

· сложение, вычитание.

При необходимости поэлементного выполнения операций над матрицами и векторами перед знаками операций ^, *, /, \ следует ставить точку:

.^,.*,./,.\

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

Обратное деление (.\) – деление 2-го вектора на первый.

Транспонирование тоже бывает с точкой, тогда для комплексных чисел оно выполняется без комплексного сопряжения.

Векторное исчисление предусматривает следующие операции над векторами: сложение и вычитание векторов одинакового размера, транспонирование векторов, умножение вектора на число, вектора на вектор (одинакого размера и один из них вектор –столбец, другой – вектор – строка или наооборот), скалярное и векторное произведение векторов.

Все действия с матрицами определены в математике.

Следует помнить:

что операция + и - определена только для сложения/ вычитания одинаковых векторов (можно суммировать или вычитать вектор - строки или вектор – столбцы одинаковой длины).

Умножение вектора на число осуществляется операцией * (без точки). Результат с точкой такой же.

Пусть ввели с клавиатуры вектор X, содержащий следующие значения: 1, 2, 3, 4

>> X*2

ans =

2 4 6 8

>> X.*2

ans =

2 4 6 8

Операция умножение (с точкой) вектора на вектор определена только для векторов одинакового размера (.*).

Y=[3 4 5 6];

При попытке использовать обычное умножение – ошибка.

>> X*Y

??? Error using ==> mtimes

Inner matrix dimensions must agree.

>> X.*Y

ans =

3 8 15 24

Возведем каждый элемент вектора в квадрат

>> X.^2

Получим

ans =

1 4 9 16

В данном случае каждый элемент исходного вектора возводится в квадрат. Выполнение команды X ^ 2 (без точки перед возведением в степень) невозможно, так как это противоречит правилам матричной алгебры. На экране будет:

??? Error using ==> mpower

Inputs must be a scalar and a square matrix.

Введем вектор Y=3 4 5 6

Y =

3 4 5 6

Умножение вектор-строки на вектор-столбец – результат - число

>> X*Y'

ans =

Умножение вектора-столбца на вектор-строку, результат – матрица

>> X'*Y

ans =

3 4 5 6

6 8 10 12

9 12 15 18

12 16 20 24

Для матриц

Над матрицами возможны поэлементные операции и матричные, соответствующими правилам матричного исчисления.

Умножение и деление матриц одинаковых размеров. Результат – матрица.

Возведение в степень.

Поэлементное вычисление функций от матриц.

Умножение матрицы на число, результат – матрица.

При умножении матриц число столбцов первой матрицы должно быть равно числу строк второй.

Матричное исчисление определяет операции: Может, Матлаб?

Сложение и вычитание матриц

Умножение матрицы на число

Умножение матрицы на матрицу

Возведение в целую степень

Транспонирование Деление?

Операции отношения используются для поэлементного сравнения двух операндов (чисел, матриц, векторов одинакового размера). Результатом операции отношения может быть соответственно число, матрица или вектор, состоящие из элементов, обозначающих «истина» или «ложь». В ML это 1 и 0 соответственно:

>>A=[1 0 3; -2 5 -6];

>> B=[8 -9 1; 7 2 2];

>> A>B

ans =

0 1 1

0 1 0

В результате получили матрицу, каждый элемент которой имеет значение «истина» или «ложь»:

>> x=1; y=2; z=3;

>> ((x+y)==z)+(y<z)+(x<=y)

ans =

Логические операции т акие же. Логические операции предназначены для выполнения поэлементных логических операций над векторами и матрицами одинаковых размеров. К логическим операциям относятся логическое И(&), логическое ИЛИ (|), логическое НЕ (~).

Вместо логических операций можно пользоваться логическими операторами (функциями) and, or, not соответственно. Логические операторы определены над матрицами одинаковой размерности и выполняются над каждым из элементов.

Приоритет операций в ML (включая матричные)

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

1) логическая операция НЕ (~);

2) транспонирование(.’, ’), возведение в степень(.^, ^);

3) унарный плюс (+), унарный минус (-);

4) умножение и деление(.*,./,.\, *, /, \);

5) сложение и вычитание (+, -);

6) операции отношения (<, >, <=, >=, ==, ~=);

7) логическая операция И(&);

8) логическая операция ИЛИ(|).

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: