-
Въвеждане на матрици.
Матриците се въвеждат като всеки ред се разделя с точка и запетая или натискане на клавиш Enter, а същи и с вградени функции на Matlab.
Примери:
>> A=[1 2 3; 5 6 7; 8 9 10]
A =
1 2 3
5 6 7
8 9 10
Начин, удобен за задаване на матрици с по-голяма размерност (разделяне с Enter за край на реда):
>> B=[1 5 7
10 11 12
-12 13 14]
B =
1 5 7
10 11 12
-12 13 14
Елементи на матрицата могат да бъдат произволни функции или комплексни числа:
>> Q=[sqrt(4+5^2); 9-8*i; exp(j*4); 3-10;]
Q =
5.3852
9.0000 - 8.0000i
-0.6536 - 0.7568i
-7.0000
Много удобен начин е въвеждане на данните в array editor, особено за големи масиви. – използва се командата openvar име на матрицата. Предварително трябва да се зададе някаква стойност на името на матрицата, макар и единична стойност – напр.
>> H=[0]
H =
0
>> openvar H
след това в редактора за масиви се задава размерността и се попълват елементите.
Размерността на въведената матрица може да се провери освен в Workspace и чрез командата size(име на матрицата) или length(име на матрицата), която връща по-голямата размерност на матрицата. Примери:
>> size(Q)
ans =
4 1
>> size(A)
ans =
-
3
>> length(Q)
ans =
4
>> length(A)
ans =
3
Функции за генериране на матрици
-
генериране на матрица с единични елементи –
ones(брой редове на матрицата, брой редове на матрицата)
Пример:
>> M=ones(3,4)
M =
1 1 1 1
1 1 1 1
1 1 1 1
-
генериране на матрица с нулеви елементи
zeros(брой редове на матрицата, брой стълбове на матрицата)
>>E=zeros(1,12)
E =
0 0 0 0 0 0 0 0 0 0 0 0
-
генериране на матрица с произволни стойности на елементите от 0.0 до 1.0 –
rand(брой редове на матрицата, брой стълбове на матрицата)
>> B=rand(2,3)
B =
0.9501 0.6068 0.8913
0.2311 0.4860 0.7621
-
създаване на матрица с единични диагонални елементи-
eye(брой редове на матрицата, брой стълбове на матрицата)
Ако матрицата е квадратна може да се въведе само 1 стойност за ред(стълб) като аргумент и резултат – единична матрица - вж. матрица D.
>> C=eye(2,3)
C =
1 0 0
0 1 0
>> D=eye(3)
D =
1 0 0
0 1 0
0 0 1
-
Индексиране на елементи – в малки скоби се заграждат номера на реда (стълба), а з многомерните масиви (матрици, индексите се разделят със запетаи – напр. C(2, 3); E(1). Така елементите на матриците участват в изрази, присвоявания, извеждане на стойност
Пример:
>> C(2,3)
ans =
0
>> E(1)
ans =
0
>> E(1)=10*exp(j*pi/6)
E =
Columns 1 through 4
8.6603 + 5.0000i 0 0 0
Columns 5 through 8
0 0 0 0
Columns 9 through 12
0 0 0 0
Знак двуеточие връща последователни редове или стълбове, а когато се приложи върху цялата матрица, резултатът е вектор-стълб от всички елементи на изходната матрица.
>> N=B(:)
N =
0.9501
0.2311
0.6068
0.4860
0.8913
0.7621
Промяна на стойностите на матрица В чрез задаване на последователност от начална:крайна стойност за числата от 11-16 (стъпката е 1).
>> B
B =
0.9501 0.6068 0.8913
0.2311 0.4860 0.7621
>> B(:)=11:16
B =
11 13 15
12 14 16
Създаване на подматрица от съществуваща и добавяне (изключване) на елементи – най-лесно в array editor, но може да се използва двуеточие (:) или функциите за матрични манипулации (описани по-долу) и др.
>> V=B(1:1,1:2)
V =
11 13
3. Операции с матрици.
Аритметичните оператори са +; -; *; /; \; ^;’ - транспониране; аритметични и логически функции.
Решение на матрични уравнения (системи линейни уравнения)
X*B=A -à РЕШЕНИЕ: X=A/B
A*X=B -à РЕШЕНИЕ: X=A\B
Тук А и В са матрици, резултатът също.
Решаване на системи уравнения
Пример:
Да се реши системата уравнения:
х1 + 2х2 + 3х3 = 4
2х1 + 3х2 +4х3 = 5
4х1 + 2х2 + 6х3 = 1
а – матрица на коефициентите пред неизвестните
b – матрица на свободните членове на системата от дясната част на системата
х – матрица на решението на системата
>> a=[1 2 3; 2 3 4; 4 2 6]
a =
1 2 3
2 3 4
4 2 6
>> b=[4; 5; 1]
b =
4
5
1
>> x=a\b
x =
-1.5000
2.0000
0.5000
При умножение на матрици се спазва правилото: Аn,k*Bk,m =Сn,m– брой стълбове на първата= брой редове на втората матрица.
За поелементни действия се записва точка преди операцията– напр. .*; ./ и др.
Сравняване на стойности на масиви – с операторите за отношения - >; <; == и т. н.
Функции за матрични манипулации:
> D
D =
1 2 3
-4 5 6
1 0 -1
завъртане на 90°
>> rot90(D)
ans =
3 6 -1
2 5 0
1 -4 1
горна триъгълна матрица:
>> triu(D)
ans =
1 2 3
0 5 6
0 0 -1
долна триъгълна матрица
>> tril(D)
ans =
1 0 0
-4 5 0
1 0 -1
Хоризонтален (разменя стълбове) огледален образ на матрица
>> D
D =
1 2 3
-4 5 6
1 0 -1
>> fliplr(D)
ans =
3 2 1
6 5 -4
-1 0 1
Вертикален (разменя редове) огледален образ на матрица
>> flipud(D)
ans =
1 0 -1
-4 5 6
1 2 3
Прилагане на елементарни матем. операции върху цяла квадратна матрица (а не поелементно) - funm(M,’функция’), където М е името на матрицата, а функцията може да е синус, логаритъм и др.:
> x=funm(D,'log10')
x =
0.2801 + 0.1190i 0.2527 - 0.0377i 0.3399 - 0.4255i
-0.4663 + 0.4443i 0.7660 - 0.1409i 0.6015 - 1.5887i
0.0872 - 0.3877i 0.0131 + 0.1230i 0.1580 + 1.3863i
Горното действие е различно от:
>> log10(D)
Warning: Log of zero.
> In F:\MATHLAB\toolbox\matlab\elfun\log10.m at line 17
ans =
0 0.3010 0.4771
0.6021 + 1.3644i 0.6990 0.7782
0 -Inf 0 + 1.3644i
Детерминанта:
>> det(D)
ans =
-16
Ранг на аргумента:
>> rank(D)
ans =
3
сума от елементите по главния диагонал – следа на матрицата
>> trace(D)
ans =
5
максимална стойност за всеки стълб, ако матрицата е двумерна, ако е матрица-ред или матрица-стълб е 1 число. Функциите за минимум, средноаритметична стойност действат по същия начин.
>> max(D)
ans =
1 5 6
минимална стойност
>> min(D)
ans =
-4 0 -1
средноаритметична стойност
>> mean(D)
ans =
-0.6667 2.3333 2.6667
Сортиране по големина - за матрици работи по стълбове, както и функциите за сума и произведение::
>> sort(D)
ans =
-4 0 -1
1 2 3
1 5 6
Сума от елементите (по стълбове)
>> sum(D)
ans =
-2 7 8
Произведение на елементите (по стълбове)
>> prod(D)
ans =
-4 0 -18
Обратна матрица
>> inv(D)
ans =
0.3125 -0.1250 0.1875
-0.1250 0.2500 1.1250
0.3125 -0.1250 -0.8125
Пример за работа с едномерен масив:
>> g=[12 3 14 56 38 78 90]
g =
12 3 14 56 38 78 90
>> sort(g)
ans =
3 12 14 38 56 78 90
>> min(g)
ans =
3
5. Бързо преобразование на Фурие
FFT(X) is the discrete Fourier transform (DFT) of vector X. For
matrices, the FFT operation is applied to each column. For N-D
arrays, the FFT operation operates on the first non-singleton
dimension.
FFT(X,N) is the N-point FFT, padded with zeros if X has less
than N points and truncated if it has more.
FFT(X,[],DIM) or FFT(X,N,DIM) applies the FFT operation across the
dimension DIM.
For length N input vector x, the DFT is a length N vector X,
with elements
N
X(k) = sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.
n=1
The inverse DFT (computed by IFFT) is given by
N
x(n) = (1/N) sum X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N.
k=1
Право преобразование на Фурие – вход-време, изход – спектър(честота).
задаваме времето:
>> t=0:1/99:1
задаваме функцията на времето като сума от 2 синусоиди
>> x=sin(2*pi*10*t)+0.5*sin(2*pi*30*t)
Изчертаваме графиката на получената функция х в зависимост от времето t
>>plot(t,x)
Извикваме функцията за БПФ:
>> y=fft(x)
Изчисляваме амплитудата на спектъра:
>> m=abs(y)
Изчертаването на амплитудата трябва да стане като по ос х се разположат стойностите на честотата.
Изчисляваме честотата:
f=(0:length(y)-1)*99/length(y)
Изчертаваме m::
plot(f,m)
Резултатът е показан на долната фигура, като са въведени заглавие и надписи по осите x и y.
Изчисляваме фазата:
>> p=unwrap(angle(y))
Изчертаваме я:
>>plot(t,p)
Резултат:
ОБФ – вход – спектър(честота), изход – време - функция ifft
>>x2=ifft(y)
Изчертаваме ОПФ на функцията y в зависимост от t
>>plot(t,ifft(y))
Резултат: Графиките на х2 и х в зависимост от t са еднакви.
Втори пример:
> x=[1 2 3 4]
x =
1 2 3 4
>> X=fft(x)
X =
10.0000 -2.0000 + 2.0000i -2.0000 -2.0000 - 2.0000i
>> x=ifft(X)
x =
1 2 3 4
Право и обратно двумерно ПБФ: -
FFT2 Two-dimensional discrete Fourier Transform.
FFT2(X) returns the two-dimensional Fourier transform of matrix X.
If X is a vector, the result will have the same orientation.
FFT2(X,MROWS,NCOLS) pads matrix X with zeros to size MROWS-by-NCOLS
before transforming.
IFFT2 Two-dimensional inverse discrete Fourier transform.
IFFT2(F) returns the two-dimensional inverse Fourier transform
of matrix F. If F is a vector, the result will have the same
orientation.
IFFT2(F,MROWS,NCOLS) pads matrix F with zeros to size MROWS-by-NCOLS
before transforming.
X1=[1+2*i 2+2*i; 3+3*i 4+4*i]
X1 =
1.0000 + 2.0000i 2.0000 + 2.0000i
3.0000 + 3.0000i 4.0000 + 4.0000i
ППФ:
>> Y=fft2(X1,2,2)
Y =
10.0000 +11.0000i -2.0000 - 1.0000i
-4.0000 - 3.0000i 0 + 1.0000i
ОПФ:
>> Z=ifft2(Y)
Z =
1.0000 + 2.0000i 2.0000 + 2.0000i
3.0000 + 3.0000i 4.0000 + 4.0000i
Аналогично е използването:
>> Z=ifft2(Y,2,2)
Z =
1.0000 + 2.0000i 2.0000 + 2.0000i
3.0000 + 3.0000i 4.0000 + 4.0000i
или
>> Y=fft2(X1)
Y =
10.0000 +11.0000i -2.0000 - 1.0000i
-4.0000 - 3.0000i 0 + 1.0000i
Изчертаването е с функцията surf.
Нека е зададен сигнал:
>> s3=[ 0 1.0654 0.6458 0.67 1.05 1.053 -0.08 -0.62 -0.71 -1.04 0.16 1.08 0.59 0.74 1.01 -0.24 -1.07 -0.57 -0.77 -0.99]
s3 =
Columns 1 through 6
0 1.0654 0.6458 0.6700 1.0500 1.0530
Columns 7 through 12
-0.0800 -0.6200 -0.7100 -1.0400 0.1600 1.0800
Columns 13 through 18
0.5900 0.7400 1.0100 -0.2400 -1.0700 -0.5700
Columns 19 through 20
-0.7700 -0.9900
Изчертаваме го
>> plot(s3)
Намираме спектъра и чертаем амплитудата:
plot(abs(fft(s3)))
Намираме спектъра на 32 стойности и чертаем амплитудата:
>> plot(abs(fft(s3,32)))
Обръщаме спектъра и чертаем във времевата област – вижда се, че автоматично попълва сигнала с нули преди да изчисли спектъра.
>>plot(real(ifft(fft(s3,32),32)))
Сподели с приятели: |