Форматные преобразования sprintf, sscanf.
ЛЕКЦИЯ 3
Элементы программирования в среде MATLAB
Операторы цикла.
Цикл – процесс повторного выполнения группы инструкций, составляющих тело цикла.
1.Циклfor.
Синтаксис цикла:
for var = a1 : a2 : a3
Инструкции
end
где var – переменная цикла, которая при каждом повторении цикла изменяется от начального значения a1 к конечному значению a3 с шагом a2 (если шаг a2 не задан, то по умолчанию a2 = 1). Если имеется несколько инструкций они разделяются запятой (,) или пробелом или точкой с запятой (;). Цикл завершается, когда значение var окажется больше a3.
2.Циклwhile.
Синтаксис цикла:
while Условие
Инструкции
end
Данный цикл выполняется до тех пор, пока истинно указанное Условие (Условие – выражение, содержащее операции сравнения и логические операции).
Замечания.
Оператор break досрочно прерывает выполнение циклов for и while. Вне циклов данный оператор не работает.
Оператор return предназначен для возврата в вызывающую функцию или в режим для работы с клавиатурой.
Оператор continue прерывает выполнение текущего шага цикла, т.е. позволяет перейти к следующей итерации в операторах циклов for и while, игнорируя все операторы, которые следуют за ним в теле цикла. Если оператор continue встречается во вложенном цикле, то осуществляется переход к следующей итерации основного цикла.
Ниже представлен простейший пример использования цикла for. В результате выполнения программы
for x=1:3:10
y=x/4
end
получим следующий результат:
y =
0.2500
y =
y =
1.7500
y =
2.5000
В следующем фрагменте программы осуществляется вычисление частичной суммы ряда
.
т.е. складывается 57 членов ряда
s=0
for k=1:1:57
s=s+1./k^2;
end;
В заголовке цикла (управляющем выражении) можно явно указать весь набор значений переменной цикла в виде вектор-строки, например:
for k=[2 5 7 8 11 15 25]
В данном случае цикл будет выполняться семь раз, при этом переменная k будет последовательно принимать значения 2, 5, 7, 8, 11, 15 и 25.
Возможным является использование матриц в заголовке цикла:
A=[1 2; 3 4];
for k=A
Количество повторений такого цикла совпадает с количеством столбцов матрицы A, т.е. в рассматриваемом примере цикл повторится два раза. На каждом шаге цикла переменная цикла принимает значение очередного столбца матрицы, т.е. переменная цикла является вектор-столбцом. Так, например, приведенный ниже фрагмент программы вычисляет сумму длин векторов, являющихся столбцами матрицы A:
S=0; A=[1 2; 3 4];
for k=A
S=S+sqrt(k(1)^2+k(2)^2);
end;
Ниже представлен простейший пример программы вычисления синуса 12 значений от 0 до 11 с помощью цикла while:
i=1; t=0;
while t<=11
y(i)=sin(t)
i=i+1;
t=t+1;
end
Рассмотрим фрагмент программы более сложного примера вычисления частичной суммы ряда
.
s=0; k=1; u=1;
while u>1.e-8
s=s+u;
k=k+1;
u=1./k^2;
end
Условием продолжения счета в данном случае является требование к складываемым элементам ряда быть больше некоторого заранее заданного числа (в данном случае это ): как только очередное слагаемое станет меньше этого числа, условие, стоящее после ключевого слова while, становится ложным и суммирование прекращается.
Отметим, что представленный фрагмент кода, в котором тело цикла занимает несколько строк, также можно вводить с клавиатуры последовательно строка за строкой, при этом необходимо нажимать клавишу Enter каждый раз после ввода очередной строки. После ввода заголовка оператора цикла и нажатия клавиши Enter текстовый курсор перемещается на следующую физическую строку, однако знак строки при вводе (>>) не появляется. По сути, это означает, что MATLAB ожидает дальнейшего ввода с клавиатуры последовательности команд, составляющих тело цикла (эти инструкции могут занимать несколько физических строк командного окна). Текстовый курсор перемещается на следующую строку после нажатия клавиши Enter. После ввода ключевого слова end система MATLAB приступает к циклически повторяющемуся выполнению инструкций из тела цикла. По завершении этого процесса, длительность выполнения которого определяется объемом вычислительной работы, на следующей за циклом строке появляется знак >>.
В системе MATLAB всюду, где это возможно, вместо операторов цикла следует применять соответствующие команды M-языка, предназначенные для обработки массивов, ввиду того, что при этом существенно сокращается время вычислений. Так, например, вместо фрагмента программы
k=0;
for x=0:0.1:100
k=k+1;
y(k)=sin(x);
end;
целесообразнее использовать операции с массивами
x=0:0.1:100;
y=sin(x);
Замену операторов цикла эквивалентными им по результату функциями M-языка принято называть векторизация кода
Пример 1.4. Вычислить сумму конечного ряда
При для пяти заданных значений : , , , ,
если
Вариант текста программы для М-файла
nx=5; n=10;
x=[0.1; 0.3; 0.4; 0.7; 1];
s=zeros(nx,1);
line='---------------------'; % 21(-)
disp(line), disp(' x s'), disp(line) % 6( )(x)10( )(s)
for k=1:n
s=s+(-1)^k*x.^k/(k*(k+1));
end
disp([x s]),disp(line)
Результат счета
---------------------
x s
---------------------
0.1000 -0.0484
0.3000 -0.1369
0.4000 -0.1777
0.7000 -0.2886
1.0000 -0.3822
Форматный вывод данных
Форматные преобразования sprintf, sscanf.
Преобразование списка данных (a1, a2, …) по формату fmt с записью результата в строку s выполняется с помощью функции sprintf:
[s]=sprintf(fmt,a1,a2,...) |
Строка формата fmt задает формат преобразования, состоящий из спецификаций, начинающихся с символа % (процент), и набора литерных символов, переносимых безо всяких изменений из строки формата в результат.
Таблица 1.9.1. Краткие сведения о символах-спецификаторах.
Спецификатор | Формат результата |
%c | Единственный символ |
%d | Целое десятичное число со знаком |
%e | Вещественное число в форме с плавающей точкой (порядок идентифицирует буква «e») |
%E | Вещественное число в форме с плавающей точкой (порядок идентифицирует буква «E») |
%f | Вещественное число в форме с фиксированной точкой |
%g | Компактная форма числа с фиксированной или плавающей точкой |
%G | Компактная форма числа с фиксированной или плавающей точкой |
%s | Строка символов |
%u | Целое десятичное число без знака |
Спецификаторы %d и %u имеет смысл применять к целочисленным значениям, причем если соответствующий элемент списка не является целым числом, то MATLAB заменяет целочисленную спецификацию на формат вещественного числа.
Все символы, включенные в состав строки fmt и не относящиеся к форматным спецификациям, являются литералами, которые без изменения переносятся в результирующую строку. Среди литералов могут присутствовать управляющие символы, представленные в таблице 1.9.2, запись которых осуществляется согласно правилам языка программирования C.
Таблица 1.9.2. Краткие сведения об управляющих символах.
Символ | Назначение |
\b | Удаление предшествующего символа (Backspace) |
\f | Перевод страницы (Form feed) |
\n | Перевод строки (New line) |
\r | Возврат каретки (Carriage return) |
\t | Горизонтальная табуляция (Horizontal tab) |
\\ | Обратная косая черта (Backslash) |
\'' | Одинарная кавычка (') |
%% | Процент (%) |
Приведем ниже несколько примеров форматного вывода данных в системе MATLAB (например, в режиме командной строки):
>> sprintf('%-7d %+7d %07d',12345,12345,12345) ans = 12345 +12345 0012345 >> sprintf('% d',12345) ans = >> sprintf('% d',-12345) ans = -12345 >> sprintf('%10.6f',pi) ans = 3.141593 >> sprintf('%9.5f',pi) ans = 3.14159 >> sprintf('%d',pi) ans = 3.141593e+00 >> sprintf('Число пи=%10.8f',pi) ans = Число пи=3.14159265 |
Обратная операция по извлечению данных из строки s, сформированной функцией sprintf, выполняется с помощью функции sscanf:
A=sscanf(s,fmt) |
Такой вариант вызова обеспечивает выборку всех данных и их обратное преобразование из символьного представления в машинное в соответствии с форматными указателями строки fmt. Форматные спецификации в данном случае те же самые, что и при преобразовании в строку.
Среди дополнительных средств управления форматом следует выделить перечисленные ниже:
– использование флажка, задаваемого символом «*», обеспечивающего пропуск очередного данного в строке s;
– использование форматов %hd, %ld и %lg, позволяющих преобразовать
извлекаемое число в машинный код короткого целого (%hd), длинного целого (%ld) или вещественного числа двойной точности (%lg);
– использование формата %[s1s2...], обеспечивающего извлечение только тех символов из строки s, которые перечислены в квадратных скобках;
– использование формата %[^s1s2...], обеспечивающего извлечение только тех символов из строки s, которые не перечислены в квадратных скобках.
Приведем характерный пример (например, в режиме командной строки):
>> s='2.7183 3.1416'; >> A=sscanf(s,'%f') A = 2.7183 3.1416 |
Заметим, что при прямом преобразовании в строку для массива A также требовалась лишь одна спецификация формата:
>> s1=sprintf('%f ',A) s1 = 2.718300 3.141600 |
Следует отметить использование литерального пробела в формате. Без него оба числовых значения оказались бы «склеенными», и для их разделения потребовались бы определенные усилия.
>> s1=sprintf('%f',A) s1 = 2.7183003.141600 |