Учебно-методическое пособие к практикуму по курсу «Пакеты компьютерной алгебры»



Pdf көрінісі
бет10/11
Дата29.04.2023
өлшемі1,85 Mb.
#88418
түріУчебно-методическое пособие
1   2   3   4   5   6   7   8   9   10   11
Байланысты:
Задачник Матлаб База ЛАБ1 ЛАБ4РК1 (2)

 , 
здесь
 
path-
name.filename
– строка (путь и имя файла);


49 
Заметим, что имена листов следует писать на английском языке, файлы не 
должны нарушать структуру матриц; создается файл по имени выходной пе-
ременной namematrix.
Ниже, на рисунке, приведен пример чтения данных из файла Excel и резуль-
тат чтения в ML: 
Файл inex.xls 
Имя листа Sheet1

импортирование текстового файла
load filename
(текстовый файл, см. пример, пусть
filename
это
inp.dat


форматированный ввод 
сначала открывается файл pathname.filename, записанный строкой в ка-
честве первого аргумента: 
fid = fopen('pathname.filename', 'permission') 
второй аргумент,'permission' – указывает на форму доступа ('r' – 
чтение из файла; 'w' – запись в новый файл, 'a' – добавление в сущест-
вующий файл, подробнее см. help); fid – файловый идентификатор, кото-
рый система связывает с файлом (здесь подразумевается, что файл располо-
жен в рабочей папке) или указывает на ошибку (например, отрицательное 
значение fid). 


50 
Затем происходит считывание данных из файла: 
a = fscanf(fid, format, size), 
здесь format = [' %g %f %e %s %c %d \n'],
указывает, что в каждой строке файла записано шесть чисел , указанного 
формата: 
%g – с плавающей точкой машинного представления 
%f – с фиксированной точкой 
%e – с плавающей точкой 
%s – строка, пробелы в которой не учитываются 
%c – строка, учитываются пробелы 
%d – целые десятичные
символ \n – переход считывания на следующую строку (перевод каретки); 
size - размер массива (матрицы), обусловлен машинным представлением, 
т.е. колонки матрицы, последовательно записаны в вектор-строку 
size = [m, n]
m - количество элементов в строке; n – количество 
элементов в столбце, n = inf, если неизвестно количество строк в файле 
(длина столбца), из которого производится чтение, т.е. size = [m, inf] 
(см. далее рисунок с примерами, случай size= [2,inf]).
Обратите внимание, что после считывания получаем матрицу, транспониро-
ванную по отношению к заданной в файле, но операция транспонирования 
A.' поставит все на свои места. 


51 
Операцию транспонирования A.' необходимо применить после считывания в 
обоих примерах, это обусловлено машинным представлением – хранением 
матриц вектором, записанным по столбцам. 

форматированный вывод 
fprintf(fid, format, namevar) 
Запись в файл namevar (записанный строкой с необходимым расширени-
ем); fid – файловый идентификатор файла, который уже открыт и пустой 
или ранее создан;
format – строка по аналогии с форматированным вводом, здесь далее при-
веден пример формата, который еще имеет поясняющие надписи 
['points number= %d x= %g y=%e surf=%f \n' ] 
fclose(fid) - команда, закрывающая созданный файл. 
Пример 4. Создание шахматной структуры, без использования циклов
%% шахматный порядок 
figure 
%m - нечетное; n-любое 
m=9 
n=6 
A=rand(m,n) 
A(1:2:end)=0 
mytitle=['m=',num2str(m),' - число строк, нечетное'] 
subplot(2,2,1),spy(A),title(mytitle) 
m=8 
%m - четное;
n=6 
A=rand(m,n) 
A(1:2:end)=0 
mytitle=['m=',num2str(m),' - четное'] 
subplot(2,2,2),spy(A), title(mytitle) 
A=rand(m,n) 
AA=A 
A=[rand(1,n);A] 


52 
A(2:2:end)=0 
A(1,:)=[] 
mytitle=['добавляем 1-ю строку; тот же алгоритм, и уда-
ляем 1-ю строку'] 
subplot(2,2,3),spy(A), title(mytitle) 


53 
Задания для самостоятельного решения 
Задание 1 

Построить блочно-диагональную матрицу, которая состоит из n блоков (n – 
целое, генерируется случайным образом на отрезке [4,8] с помощью 
randi или randint – зависит от версии MatLab).

Блоки строятся генератором равномерно распределенных чисел на отрез-
ке [0,1], размер каждого из n блоков определяется арифметической 
прогрессией n:1:2n-1.

Вывести на экран структуру матрицы командой spy. 
Задание 2 

Построить матрицу A пятого порядка с помощью генератора rand.

Вычислить A' A и A'+A и доказать, что полученные матрицы симмет-
ричны. При выполнении задания циклы использовать нельзя. 
Задание 3 

Второй и предпоследний блоки блочно-диагональной матрицы (см. 
задание 1) определяют подматрицу блочной матрицы, начинающейся
с n+1 –й строки и столбца и до end-(2n-1) строки и столбца.

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

Структуру матрицы отобразить на экране с помощью команды spy. 
Задание 4 

Постройте заполненную матрицу размера (m,n).

Расставьте нули в матрице в шахматном порядке, не используя опера-
торов цикла.

Рассмотрите случаи для четного и нечетного значений m.

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


54 
Задание 5 

Предложите два способа суммирования элементов вектора длины 
10000000 (сгенерируйте случайным образом с помощью rand), без 
использования цикла.

Оцените скорость выполнения операций в обоих случаях. Команды 
оценивания времени работы процессора: tic, toc; -секундомер; и 
затраты на процесс как разница времени начала и конца: 

t1=clock
, инструкции алгоритма, t2=etime(clock,t1) 
Задание 6 

Задайте n - размер матриц A=ones(n), B=zeros(n); n=size(C), C 
– произвольная матрица, состоящая из нулей и единиц, сгенерирован-
ная randi (randint).

Объясните смысл и результат следующих операций:
B&C 
A|C
Замечание. Любую матрицу, элементы которой нули, или единицы, можно 
конвертировать в логическую. Например, матрица A=logical(ones(n))
– логическая; здесь logical – конвертер. 
Контрольные задания и вопросы 
Выполните и объясните следующие команды. Полагайте переменные зада-
ний 1-4 глобальными. 
Задание 1. help elmat 
ones(2,5) 
A=[1:3;4:6] 
B=ones(size(A)) 
eye(5)
rand(5)
C=zeros(3) 


55 
Задание 2. help >
D=[1-i 2; 0.5i -1+2*i] 
real(D) 
imag(D) 
D1=D’ 
D2=D.’
% объясните отличие D1 D2
A’ 
% матрица A из задания 1
Задание 3. Выполнить, объяснить особенности 
10/3 
format rational 
1/3 
format short 
1/3 
% обратите внимание на системные переменные,
% которые являются результатом выполнения последних двух команд
1/0
0/0 
realmin 
realmax 
Задание 4. Выполнить, определить размер результирующих массивов. Объ-
яснить.
A=[A; sin(0.5*pi*(1:3))] 
diag(A)
diag(diag(A)) 
S=sum(A) 
S=sum(sum(A)) 
abs(A) 
norm(A) 
%определите по справке, какую норму вы определили


56 
Объекты класса Char. Функции и свойства
Объекты типа Char являются потомком ARRAY, поэтому для них спра-
ведливы все принципы, которые поддерживаются для массивов.
Объекты типа Char – строки; строки состоят из цифр, букв и символов 
таблицы ASCII, каждый элемент строки занимает два байта, это является 
нетипичным для других языков программирования, в которых одному 
элементу отводится один байт памяти, но MatLab ориентирован на 
матричные вычисления, в основе которых лежит комплексная арифметика 
(переход от операций комплексной арифметики к вещественной достигается 
автоматически с нулевой мнимой частью, обратный переход автоматически 
невозможен), это и обусловливает резервирование еще одного байта на 
комплексную часть.
Справка о создании, контроле типа и редактировании строковых перемен-
ных  
% Задание строки:
% один или серия символов заключается в апостроф 
A='ученье' 
% кавычка задается четырьмя апострофами
A=''''ученье'''' 
% выводится “ученье” 
% контроль типа:
% является ли аргумент функции ischar строкой, 
ischar(A)
% если да, то результат - логическая единица
length(A)
% количество элементов строки равно 10
% Конкатенация строк (по правилом матричной алгебры): 
% строки записываются матрицей размера 2

3
['tip'; 'top']
% аналогично функцией strvcat (важно: согласование раз-
мерностей по столбцам не требуется!)
% две строки последовательно записываются строкой %из 
шести букв,аналогично функцией strcat 
['tip', 'top']


57 
% Поиск букв или лексем: 
S= ’sin(x)*cos(y)’, s=’x’ 
% ищем в большей строке меньшую 
k = findstr(s, S)
% ищем в строке первого аргумента строку второго 
r = strfind(S, s)
isempty(k), isempty(r) 
% проверка хотя бы
% одного совпадения лексем (успех - логическая единица) 
%% Сравнение строковых переменных v1 и v2 
% v1 сравнилось c v2, если все буквы совпали с учетом
% регистра
strcmp(v1,v2)
% v1 сравнилось c v2, если все буквы совпали без учета 
% регистра
strcmpi(v1,v2) 
% сравнилось n букв, с учетом регистра
strncmp(v1,v2,n)
% сравниваются n букв без учета регистра
strncmpi(v1,v2,n) 
Пример 1. Конкатенация (соединение) строк
% Конкатенация строк с пробелами и без в конце,
% первый способ: 
strcat('C ', 'Новым ', 'Годом!') 
% пробел – элемент строки!
strcat('C', 'Новым', 'Годом!')
% второй способ: 
['C ', 'Новым ', 'Годом!'] 
Пример 2. Сравнение строк 
% c учетом регистра и без: 
s1='ABCDEFGH' 
s2='ABCDefgh' 
s3='ABCabc' 
strcmp(s1,s2) 
strcmpi(s1,s2) 
strncmp(s1,s2,3)


58 
Пример 3. Сравнение матриц, элементы которых - строки 
% c учетом регистра и без: 
sm1=['1234567'; 'ABCDEFG'], sm2=['1234567'; 'ABCDefg'] 
strcmp(sm1, sm2) 
strncmp(sm1, sm2, 4) 
strcmpi(sm1, sm2) 
sm3=['1234567'; 'ABCDEFG'] 
sm4=['1234567'; 'ABCdefg'] 
strcmpi(sm3, sm4) 
Пример 4. Преобразование регистра строки 
% строчные буквы:
 
lower('Happy Birthday - С Днем Рождения!') 
% прописные буквы: 
upper('Happy New Year - С Новым Годом!') 
Пример 5. Выделение лексем
% выделение слов, составляющих выражение,
% разделенных пробелами
s='С Новым Годом!' 
[t1, r1] = strtok(s) 
[t2, r2] = strtok(r1) 
[t3, r3] = strtok(r2)
% выбраны три лексемы в переменных: t1, t2, t3 
% выделение слов, составляющих выражение, разделенных 
%нестандартными разделителями:
s='a+b*c' 
[t1, r1] = strtok(s, '+*') 
[t2, r2] = strtok(s, '+*') 
[t3, r3] = strtok(s, '+*') 
% второй аргумент –строка, должна содержать весь набор 
%разделителей
Пример 6. Поиск элементов строки (подстрок в строке) 
% результат – номер элемента в строке поиска, с которо-
го, начинаются совпадения 
 
s1='00', s2='2003'; s3='100002' 


59 
findstr(s1,s2) 
findstr(s2,s1) 
strfind(s1,s2) 
strfind(s2,s1) 
findstr(s3,s1) 
Пример 7. Поиск элементов (подстрок) в многомерных строках
sm=strvcat('com', 'compare', 'computer') 
strmatch('com', sm) 
strmatch('com', sm, 'exact') 
s='123com' 
strmatch('com',s) 
sc={'com';'compare';'computer'} 
strmatch('com', sc) 
Пример 8. Поиск и замена элементов строки 
s='12341234' 
s1=strrep(s, '123', 'ABCD') 
s2=strrep(s, '124', 'ABCD') 
s3=strrep(s, '123', '') 
Пример 9. Вывод элементов таблицы ASCII 
%
вся таблица
char(1:255)
% xyz
char(120:122)
Пример 10. Заполнение многомерной строки элементами 
%
второй и третий аргументы – размерности %массива
repmat('=', 1,4)
repmat('*-', 3,4)
Пример 11. Выравнивание строки
s=' 123456 ' 
sl=strjust(s, 'left') 
sc=strjust(s, 'center') 
sr=strjust(s, 'right') 


60 
Пример 12. Выполнение фрагментов строки
s='С Новым Годом!'; 
s(1:2) 
s(3:8) 
s(9:end) 
Пример 13. Выявление позиций элемента в строке
s='С Новым Годом!'; 
r=eq(s, 'о') 
% или равносильно: 
q=r=='о'; 
if any(r), disp('есть совпадение'),end % 
sum(r) 
% количество совпадений 
index=find(r)
% порядковые номера позиций совпадений


61 
Объекты класса Cell. Функции и свойства 
Cell – конструктор класса, массива разнородных объектов – ячеек. Од-
нако с его помощью только задается размер массива. Фигурные скобки ис-
пользуются для перечисления его элементов, а также для указания индексов 
при оперировании его объектами. 
Способы создания: делятся на декларативные, описательные, конвер-
тационные и создаваемые системой. К числу создаваемых системой относят-
ся массивы ячеек, получаемые при формировании выходных параметров 
переменной длины, массивы ячеек, которые используются системой и поль-
зователем при обработке событий пользовательского интерфейса и т.д. 
В отличие от ранее рассмотренных объектов, содержание массива 
ячеек даже при отсутствии подавления вывода точкой с запятой (;) будет не-
видимым. 
Функция celldisp(c) – визуализации элементов, решит эту про-
блему, также как и команда c{:}
Пример 1. Создание массивов ячеек
A=ones(6)
% резервирование
C=cell(size(A)) 
b = {
'
sin(x.^2)/(3 * pi* x.^2)
'
,[1:2:pi],rand(5)} 
celldisp(b) 
% каждый элемент полученной матрицы –
% ячейка, состоит из одного элемента, обращение к (i,j) 
% элементу %g{i,j}; 
g=num2cell(randn(3)) 
% r –массив ячеек, состоящий из одного элемента, и 
% этот элемент есть матрица класса double 4-го порядка 
% – и обращение к (i,j) элементу r{1}(i,j) 
r=mat2cell(rand(4)) 
%понять адресацию к элементам d
d = {[1] [2 3 4]; [5; 9] [6 7 8; 10 11 12]} 
iscell(d)
% контроль типов 


62 
Пример 2. Поиск совпадающих лексем с использованием массивов ячеек
sc1=[{'1234'}; 'ABCDEFGH'] 
sc2=[{'1235'}; 'ABCDefgh'] 
strcmp(sc1, sc2) 
% поиск совпадений без учета регистра
strcmpi(sc1, sc2) 
strncmp(sc1, sc2, 3) 
% поиск первого совпадения трех
% подряд элементов строки
Пример 3. Эффективного построения блочно-диагональной матрицы - 
blkdiag
% матрицы для блоков – массив % ячеек
Blocks={rand(3);randn(5);ones(4)} 
% B - блочно-диагональная матрица
B=blkdiag(Blocks{:})
Пример 4. Конвертирования в char
str = { 'Goodbye', 'cruel', 'world' } 
char(str{:})
Пример 5. Конкатенации 
c = { [3 4], [5 6] }; 
cat(1, [1 2], c{:} ) 
% добавление строк
cat(2, [1 2], c{:} ) 
% добавление столбцов
e = {}; cat(2, [1 2], e{:} ) 
Пример 6. Создания массива ячеек 
T = cell(1,9); % резервирование 
T(1:2) = { [1], [1 0] }; 
for n=2:8, T{n+1}=[2*T{n} 0] - [0 0 T{n-1}]; end 
T{4} 


63 
Создание функций в Matlab 
В ML для эффективного программирования используются процедуры и 
процедуры-функции. Каждая процедура записывается в отдельном файле с 
расширением *.m и имя процедуры должно совпадать с именем этого фай-
ла. 
Функции и процедуры 
Для создания процедур и процедур-функций используется одинаковый 
заголовок, но в процедуре может быть один или несколько выходных пара-
метров 
function [out1,out2] = myproc(in1,in2,in3) 
а в функции только один, который вычисляется в последнем исполняемом 
операторе процедуры. 
function resfunc = myfun(in1,in2,in3) 
. . . . . . . . . . . . . . . . . . . 
resfunc=sin(in1)*in2^in3 
% некоторое выражение 
Пример 1. Процедуры 
function [x1,x2] = quadform(a,b,c) 
d = sqrt(bˆ2 - 4*a*c); 
x1 = (-b + d) / (2*a); 
x2 = (-b - d) / (2*a);
Обратиться к процедуре можно [r1,r2]=quadform(1,1,1), исполь-
зуя конкретные значения входных параметров.
В MATLAB имеются встроенные функции, которые могут иметь меняю-
щееся число входных аргументов и меняющееся число выходных парамет-
ров. Например, функция S=svd(A) вычисления сингулярных чисел матрицы A. 
Она может применяться в виде *U,S,V+=svd(A), когда требуется большее чис-


64 
ло выходных параметров. Другим примером такой функции может служить 
функция cat(A,B) горизонтального объединения массивов A и B . Она может 
иметь произвольное число входных массивов, cat(A1,A2,A3,A4). 
При написании собственных функций в ML существует возможность 
указывать переменное количество входных и выходных аргументов.
Для это-
го предназначен массив ячеек переменной длины varargin для входных па-
раметров и varargout для выходных. В этом случае заголовок процедуры бу-
дет иметь вид: 
function [out1,out2,varargout] = myproc(in1,in2,in3, 
varargin) 
Такие ситуации обусловлены тем, что пользователь сам решает в каждом 
конкретном случае, что ему нужно на выходе, например, кроме постоянного 
выходного параметра вектора-решения, точность и или номер итерации. 
При обращении к такой процедуре будут заданы конкретные параметры va-
rin1, varin2,… и идентификаторы varout1, varout2,… 
Неопределенность длин этих массивов ячеек накладывает дополни-
тельную ответственность на программиста при программировании проце-
дур. Так в момент обращения все переменные аргументы помещаются сис-
темой в varargin, их следует оттуда извлечь и присвоить соответствую-
щим сущностям-переменным.
Длину массива varargin определяем по формуле: количество всех 
входных переменных (определяет функция nargin) минус количество по-
стоянных входных аргументов, так же как и длину varargout; количество 
всех выходных переменных определяет функция nargout. 
Пример 2. Тип файла – функция. Имя файла – varlist.m
function varlist(varargin) 
fprintf('Number of arguments: %d\n',nargin); 
% nargin – количество входных аргументов в функции 
celldisp(varargin) 


65 
Вызов функции:
varlist(ones(2),'some text',pi)
Результат: 
Number of arguments: 3 
varargin{1} = 
1 1 
1 1 
varargin{2} = some text 
varargin{3} = 3.1416 
Пример 3. Тип файла – функция. Имя файла – sizeout.m 
function [s,varargout] = sizeout(x) 
nout = max(nargout,1) - 1; 
% nargout – количество выходных аргументов функции 
s = size(x); 
for k=1:nout 
varargout{k} = s(k); 
end 
Вызов функции:
[s,rows,cols] = sizeout(rand(4,5,2))


Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   10   11




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет