Чтение из двоичного файла, Если заранее не известно количество элементов в нем 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Чтение из двоичного файла, Если заранее не известно количество элементов в нем



Пусть нам о файле exFwrite1_1.dat уже известно, что он состоит из 32-разрядных значений. Файл будет открыт, туда будет записано значение переменной х, и в соответствии с величиной х произойдет циклический ввод в матрицу А, с участием пользователя, в Command Window. Затем файл будет закрыт и после этого будет открыт другой файл exFwrite1_2.dat' (при необходимости будет создан). В него будет записана величина х и матрица А.

function[]=exFwrite1(x) f=fopen('exFwrite1_1.dat','wb'); fwrite(f,x,'int32'); for i=1:x    chislo=input('chislo=');    fwrite(f,chislo,'float32');   A(i)=chislo; end fclose(f); f=fopen('exFwrite1_2.dat','wb'); fwrite(f,x,'int32'); fwrite(f,A,'float32'); fclose(f);    end function Start_exFwrite1_exFread x=4; exFwrite1(x) exFread() end выполняется exFwrite1(x) chislo=1 chislo=2 chislo=3 chislo=4 выполняется exFread() x = 4 A = 1 2 3 4 x = 4 A = 1 3 2 4

Команда fseek(f,0,1); означает перевод указателя в конец файла и после этого команда n=ftell(f)/4 получает текущее положение указателя в байтах от начала файла (фактически, длину файла) и затем делит его на 4, так как файл состоит из 32-разрядных (по 4 байта) элементов, получая количество элементов в файле. Первое из них целое, остальные массив вещественных чисел (см. выше по тексту как заполнялся этот файл).

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

function[]=exFseek() f=fopen('exFwrite1_1.dat','rb'); fseek(f,0,1); n=ftell(f)/4 frewind(f); x=fread(f,1,'int32') A=fread(f,n-1,'float32') fclose(f); end function Start_exFwrite1_exFseek x=4; exFwrite1(x) exFread() end выполняется exFwrite1(x) chislo=1 chislo=2 chislo=3 chislo=4 выполняется exFseek() n = 5 x = 4 A = 1 2 3 4

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

Горизонтальная конкатенация векторов-строк это объединение нескольких строк, состоящих из чисел, в одну длинную строку.

Вертикальная конкатенация векторов-строк это объединение нескольких строк в матрицу.

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

Вертикальная конкатенация матриц дает матрицу, число строк в которой равно сумме числа строк в исходных матрицах.

function [VertConcat, HorisConc] =Start_VertConcat_HorisConc vectA=[1;2;3]; vectB=[3;4;5]; vectC=[6;7;8]; VertConcat=[vectA vectB vectC]; HorisConc=[vectA' vectB' vectC']; end VertConcat = 1 3 6 2 4 7 3 5 8 HorisConc = 1 2 3 3 4 5 6 7 8

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

Можно выделить из матрицы столбец.

Можно выделить из матрицы строку.

Можно указать диапазон строк и диапазон столбцов

Можно в матрицу с большим числом строк и столбцов вставить матрицу с меньшим числом строк и столбцов, при этом прежние элементы большой матрицы, стоявшие на этих местах, будут утрачены. На их месте будут стоять элементы меньшей матрицы.

Можно удалить из матрицы целиком строку или столбец.

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

function [MatrA1, MatrA2] =Start_MatrA MatrA1=VertConcat(:,2); MatrA2=VertConcat(3,:); end   MatrA1 = 3 4 5 MatrA2 = 3 5 8

Аналогично можно из вектора выделить определенные элементы. Можно удалить определенный элемент из вектора.

function [MatrA, VertConcat] =Start_MatrA_VertConcat MatrA=VertConcat(2:3,1:2); VertConcat(1:2,2:3)=MatrA; end     MatrA = 2 4 3 5 VertConcat = 1 2 4 2 3 5 3 5 8

Можно выделить часть матрицы, указав, какие строки и столбцы должна в нее войти из состава исходной матрицы.

function [MatrB,MatrC] = Start_MatrB_MatrC MatrB=VertConcat; MatrB(1,:)=[]; MatrC=VertConcat; MatrC(:,2:3)=[11]; end MatrB = 2 3 5 3 5 8 MatrC = 1 11 11 2 11 11 3 11 11

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

function [vect1,vect,v]=Start_vect_v vect=VertConcat(:); vect(4:6)=[] vect1=vect; v=vect(2:4); end vect1 = 1 2 3 5 8   v = 2 3 5 vect = 1 2 3 2 3 5 4 5 8

Операции над матрицами. Матрицы можно складывать (вычитать) друг с другом или с числом (поэлементно), а также транспонировать At = A ’. Также можно поэлементно умножать (делить) одну матрицу на другую. C = A.* At

function [A,At,B,C]=Start_ABC A=[1 2;3 4]; At=A'; B=A+At; C=A.*At; end A = 1 2 3 4 At = 1 3 2 4 B = 2 5 5 8 C = 1 6 6 16

Матрицы можно умножать на матрицу. Можно получить обратную матрицу. Можно получить матрицу как функцию (поэлементно) от другой матрицы. Например, возвести в степень или вычислить синус.

function [D,C,Aobr,E]=Start_DCAoE A=[1 2;3 4]; D=A*B; C=D./5; Aobr=A^(-1); E=A*Aobr; end D = 12 21 26 47 C = 2.4000 4.2000 5.2000 9.4000 Aobr = -2.0000 1.0000 1.5000 -0.5000 E = 1.0000    0 0.0000 1.0000

Функции операций над векторами. Для использования вектора бывает необходимо определить функцией length его длину. Также бывает нужно функцией prod вычислить произведение его элементов. Часто бывает нужна сумма sum элементов вектора. Нахождение минимума и максимума осуществляют функции min и max. Среднее арифметическое определяет функция mean. Для сортировки одномерного массива есть функция sort (по возрастанию).

function Start_LMMSPM v=[1 2 3 4 5]; L=length(v) MinV=min(v) MaxV=max(v) SumV=sum(v) ProdV=prod(v) v2=sort(v) MeanV=mean(v) end L = 5 MinV = 1 MaxV = 5 SumV = 15 ProdV = 120 v2 = 1 2 3 4 5 MeanV = 3

Для характерных задач курса линейной алгебры есть функция dot вычисляющая скалярное произведение векторов и функция cross находящая векторное произведение.

function Start_abcd a=[1 2 3] b=a+5 d=dot(a,b) c=cross(a,b) end   a = 1 2 3 b = 6 7 8 d = 44 c = -5 10 -5

По убыванию сортируют, используя со знаком минус –sort. Для получения единичной матрицы заданных размеров есть функция eye. Функция diag(Vect, K) возвращает квадратную матритцу с элементами вектора V на K-й диагонали или, если диагональ не указана, то на главной диагонали. Для получения матрицы состоящей из единиц есть функция ones. Для получения матрицы состоящей из нулей есть функция zeros.

function Start_vABvvA v =[1 2 3] A=diag(v) B=diag(v,2) vect=diag(B,2) vs=-sort(v) A=eye(2,2) B=ones(3,2) c=zeros(2,2) end A = 1 0 0 0 2 0 0 0 3 B = 0 0 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 vect = 1 2 3 vs = -1 -2 -3 A = 1 0 0 1 B = 1 1 1 1 1 1 c = 0 0 0 0  

Если же Vect это матрица определенная заранее, то функция diag вернет вектор, состоящий из элементов K-й диагонали (если диагональ не указана, то главной диагонали).

Можно размножить матрицу А, создав такую матрицу, которая состоит из N копий матрицы A по горизонтали и M по вертикали. Для этого есть функция repmat(A,N,M).

Для создания нижнетреугольной матрицы есть функция tril. Если в ней не указан номер диагонали, то строится по отношению к главной диагонали.

function Start_ABtril A=[1 2; 3 4] B=repmat(A,2,2) C=tril(B,1) end A = 1 2 3 4   B = 1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4 C = 1 2 0 0 3 4 3 0 1 2 1 2 3 4 3 4

Для заполнения матрицы случайными числами есть функция rand. Если размеры матрицы не указаны, то будет одно случайное число. Кроме того, для заполнения числами по нормальному закону есть функция randn. Для создания массива из N значений от Х до У равномерно отстоящих друг от друга есть функция linspace(X,Y,N). Если надо равномерно в логарифмическом масштабе заполнить массив от 10А до 10В то применяется функция logspace(A,B,N).

function Start_RRNLLL R=rand(2,3) RN=randn(2,2) L=linspace(1,10,3) LL=logspace(1,2,3) end R = 0.9501 0.6068 0.8913 0.2311 0.4860 0.7621 RN = -0.4326 0.1253 -1.6656 0.2877 L = 1.0000 5.5000 10.0000 LL = 10.0000 31.6228 100.0000

Норму матрицы возвращает функция norm. При этом ее параметры 1-первая норма, 2-вторая норма, inf-бесконечная норма, ‘fro’-евклидова норма матрицы. Для верхнетреугольной матрицы есть функция triu, строит матрицу относительно указанной строки. Функция size определяет число строк и столбцов матрицы. Определитель матрицы (квадратной) вычисляет функция det.

function Start_BNNorm B=[1 2; 3 4] N1=norm(B,1) N2=norm(B,inf) Norm=norm(B,'fro') TB=triu(B) [n,m]=size(B) end B = 1 2 3 4 N1 = 6 N2 = 7 Norm = 5.4772 TB = 1 2 0 4 n = 2 m = 2  

Функции min, max, mean применяются не только к векторам, но и к матрицам. Они возвращают вектор значений, каждое из которых является результатом применения функции к столбцу матрицы. Функция sort упорядочивает по возрастанию каждый столбец матрицы. Определитель матрицы (квадратной) вычисляет функция det. След матрицы (сумму элементов главной диагонали) вычисляет функция trace. Число обусловленности матрицы (в зависимости от параметра) возвращает функция cond. Величину, обратную числу обусловленности (относительно первой нормы), возвращает функция rcond. Если число маленькое, плохо обусловлена. Если близко к единице, то хорошо обусловлена.

function Start_MMMSDT B=[1 2; 3 4] MaxB=max(B) MinB=min(B) MeanB=mean(B) SB=sort(B) D=det(B) T=trace(B) C=cond(B) RC=rcond(B) end MaxB = 3 4 MinB = 1 2 MeanB = 2 3 SB = 1 2 3 4 D = -2 T = 5 C = 14.9330 RC = 0.0476

Собственные значения матрицы находит функция eig. Она же находит матрицу собственных векторов (записывая их в столбцы), если вызвать ее в формате [Matr, Chisla]=eig(A) при этом собственные значения будут в диагональной матрице Chisla. Коэффициенты характеристического полинома возвращает функция poly.

Для решения системы линейных уравнений вида Ax = b предназначена функция linsolve(A,b). Ранг матрицы системы можно узнать функцией rank. Она же возвращает и ранг расширенной матрицы.



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 49; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.19.251 (0.006 с.)