Автор: Пользователь скрыл имя, 12 Ноября 2010 в 00:08, курс лекций
Переменные рабочего пространства. Арифметические выражения. Типы данных. Скрипты и функции. Операторы MATLAB. Работа с файлами. Работа с текстовыми файлами.
s=fclose(f_id) | закрытие файла с номером f_id |
s=fclose('all') | закрытие всех открытых к этому моменту файлов |
Если
операция закрытие завершена неудачно,
то s=-1.
Контроль на достижение конца файла осуществляется с помощью функции feof:
k=feof(f_id);
Если k=0, то в файле еще есть непрочитанные данные.
Если
k=1, то файл исчерпан.
Далее
рассмотри только работу с текстовыми
файлами.
Работа с текстовыми файлами
У текстовых данных переменная длина строки. Строка завершается признаком конца (символы типа CR – возврат каретки – шестнадцатеричный код OD, LF – перевод строки – код 0A).
Вывод с форматированием строки в файл осуществляется с помощью функции:
с=fprintf(f_id,'форматная строка',переменная1, переменная2,…);
f_id – номер открытого файла.
с – количество байтов, которые удалось записать в указанный файл (с учетом двухбайтового символа конца строки).
Форматная строка содержит форматные указатели и литеральные символы. К последним относятся все символы, не принадлежащие к форматным указателям. Литеральные символы включаются в выводимую строку без каких-либо преобразований
Указатель формата начинается с символа '%', за которым могут быть расположены три необязательные компоненты – флажки, ширина (w) и точность (.n). Завершается указатель одним из символов, характеризующих тип преобразования данных (см. табл.).
d | преобразование целочисленного значения в десятичное число со знаком |
i | преобразование целочисленного значения в десятичное число со знаком |
o | преобразование целочисленного значения в восьмеричное число со знаком |
u | преобразование целочисленного значения в десятичное число без знака |
x | преобразование
целочисленного значения в шестнадцатиричное
число без знака с |
X | преобразование
целочисленного значения в шестнадцатиричное
число без знака с |
f | преобразование числового значения в вещественное число с фиксированной запятой |
e | преобразование числового значения в вещественное число с плавающей запятой, признак порядка – e |
E | преобразование числового значения в вещественное число с плавающей запятой, признак порядка – E |
g | преобразование
числового значения в вещественное
число с фиксированной или
плавающей запятой в |
G | преобразование
числового значения в вещественное
число с фиксированной или
плавающей запятой в |
s | преобразование текстового значения в строку символов |
c | преобразование единственного символа |
В качестве флажков могут использоваться следующие символы:
- | вывод очередного значения, начиная с левой границы текущего поля (по умолчанию значение прижимается к правой границе) |
+ | обязательное включение знака числа |
пробел | вывод пробела вместо знака положительного числа |
# | формирование префиксов у восьмеричных и шестнадцатиричных чисел (восьмеричное начинается с 0, шестнадцатиричное – с 0x или 0X) |
Среди литеральных констант в командной строке могут использоваться управляющие Esc-последовательности.
\b | забой предыдущего символа (Backspace) |
\f | перевод страницы (Form feed) |
\n | новая строка (New line) |
\r | возврат каретки (Carriage return) |
\t | горизонтальная табуляция (Horizontal tab) |
При отсутствии f_id или при f_id=1 вывод происходит командное окно:
>>fprintf('%s\n','ABCD');
ABCD
Если длина списка форматных указателей меньше, чем количество преобразуемых данных, то список циклически повторяется:
>>fprintf('%4d',1,2,3,4);
1
2 3 4
В
качестве элемента выводного списка может
быть матрица. Тогда список форматных
указателей определяет преобразование
каждого элемента очередного столбца
матрицы. Если выводится двумерный массив,
то он выводится по столбцам!
Чтение данных из текстового файла может быть произведено с помощью функции
[a n] = fscanf(f_id,'format',m);
a – принимающий массив;
n – количество фактически считанных значений (элементов, а не байтов!);
f_id – номер открытого файла;
format – список форматных указателей (как и у fprintf);
m – количество запрашиваемых данных (если отсутствует или равен Inf, то данные считываются до конца файла).
k=fopen('a.txt','wt');
>> a=eye(3,4)
a =
1 0 0 0
0 1 0 0
0 0 1 0
>> n=fprintf(k,'%d ',a) % - сохранение в файл (по столбцам!!!), пробел после %d необходим для отделения чисел
n =
24
>> fclose(k);
>> k=fopen('a.txt','rt');
>> [b n]=fscanf(k,'%d',[3 4])
b =
1 0 0 0
0 1 0 0
0 0 1 0
n =
12
>> frewind(k); % вернуть указатель на начало файла
>> [c n]=fscanf(k,'%d',3) % прочитать 3 значения (1-й столбец)
c =
1
0
0
n =
3
Задания на функции:
Задания на файлы:
function write(fname,a,b,h)
k=fopen(fname,'wt');
x=a:h:b;
y=sin(x);
tmp=size(x);
fprintf(k,'%d ',tmp(2)); %размерность вектора
fprintf(k,'%f ',[x;y]');
fclose(k);
function [x,y]=read(fname)
k=fopen(fname,'rt');
n=fscanf(k,'%d',1);
x=fscanf(k,'%f',n);
y=fscanf(k,'%f');
fclose(k);
function graf(fname,x,y)
[x y]=read(fname);
plot(x,y);
legend('sin(x)');
title('Graphic Sin(x)');
Решение
совместной системы
линейных уравнений
Систему линейных уравнений
обычно кратко записывают в виде Ax=b. Данная система совместа (имеет решение) тогда и только тогда, когда ранг матрицы коэффициентов r=rank(A) равен рангу расширенной матрицы R=rank([A b]) и равен числу переменных.
Единственное решение такой системы задается формулой x=A-1b или на языке MATLAB:
x=inv(A)*b
Здесь
b – матрица, которая может содержать
несколько столбцов, т.е. одной матричной
операцией можно решить сразу несколько
систем линейных уравнений с одной и той
же матрицей коэффициентов, но разными
наборами правых частей.
Пример. Нахождение корней системы линейных уравнений
>>a=[1 -1 1; 2 0 2; 0 1 1];
>>b=[1; 4; 2];
>>x=inv(a)*b
x=
1
1
1
Решение
нелинейного уравнения
с одной неизвестной
Для решения уравнений вида fun(x)=0, где fun – нелинейная функция, используется функция fzero. Алгоритм ее реализации представляет собой комбинацию метода бисекции (половинного деления), метода секущих и метода обратной квадратичной интерполяции.
Простейший формат использования функции fzero:
x=fzero(fun, x0)
Здесь fun – указатель на функцию, который может быть задан одним из трех способов:
Аргумент x0 (начальное приближение) может быть задан одним из двух способов:
Для облегчения работы по выбору начального приближения, разумнее всего построить график функции y=fun(x). Например, построим график функции :
x=0:0.1:2*pi;
>> plot(x,x.*exp(-x)+sin(x)) >> grid on >> title('y=x*exp(-x)+sin(x)') Из графика видно, что один из корней находится на интервале [3, 4]. Поэтому вызовем функцию fzero следующим образом: >> fzero('x.*exp(-x)+sin(x)',[3, 4]) ans = 3.2665 |
Рис. 7. График функции для локализации корня |
Если функцию нахождения корня записать в виде отдельного m-файла:, то обращение к функции fzero могло быть следующим:
function fzero1
x=fzero(@f1, [3, 4])