FreeMat v4.0日本語ドキュメント
変換/逆変換

 

ドキュメント目次

-------------------------------------------------------------------------------------------------------------------------------------------
fft 高速フーリエ変換

  [構文] 
 y = fft(x,n,d) 
離散フーリエ変換を行います。
xはデータ、nはFFTサイズ、dはFFTを行う次元(列方向か、行方向か)をあらわします。
データサイズがFFTサイズより小さい場合は0を挿入しFFTサイズになるように調整します。逆にデータサイズがFFTサイズ
より大きい場合は、データは打ち切られFFTサイズにてFFT処理がされます。n、dは省略することができます。
 
本FFT関数は、http://www.netlib.orgのFFTPack ライブラリを使用しています。

 
  [例] 
(1) 
--> t = linspace(0,2*pi,128);
--> x = cos(15*t);
--> y = fft(x);
--> plot(t,abs(y));

(2)
次元(d)を変えることでFFT処理のデータを列データか行データか選択することができます。以下にdを変えることで結果
が異なる例を示します。 
--> A = [2,5;3,6]

A =

2 5
3 6

--> real(fft(A,[],1))

ans =

5 11
-1 -1

--> real(fft(A,[],2))

ans =

7 -3
9 -3
 
(3)
時間軸上のデータに0挿入することで周波数軸上のデータを増やし分解能をあげることが可能です。
--> t=0:0.1:1;
--> y=sin(2*3*pi*t);
--> Y1=fft(y);%データ数は10個のみ
--> plot(abs(Y1),'b-o')
--> Y2=fft(y,64);%データ数は64個。64-10=54個は0が挿入
--> plot(1:10/64:11-10/64,abs(Y2),'r-o')
 



-------------------------------------------------------------------------------------------------------------------------------------------
inv 逆行列 

  [構文]

 y = inv(x)

逆行列を求めます。関数内部では行列除算演算子が用いられます。疎行列では疎行列ソルバが使用されます。

  [例] 
--> a = randi(zeros(3),5*ones(3))

a =

1 1 4
1 0 1
0 4 1

--> b = inv(a)

b =

-0.3636 1.3636 0.0909
-0.0909 0.0909 0.2727
0.3636 -0.3636 -0.0909

--> a*b

ans =

1.0000 0.0000 0
0 1.0000 0.0000
0 0 1.0000

--> b*a

ans =

1.0000 0.0000 0.0000
0 1.0000 -0.0000
0 0 1.0000

-------------------------------------------------------------------------------------------------------------------------------------------
lu Lu分解

  [構文] 
■入力引数が非疎行列 
 [L,U,P] = lu(A)
Lは、下三角行列、Uは上三角行列。 L*U = P*Aを満たします。
 [V,U] = lu(A)
V = P'*Lを満たします。 
 ■入力引数は疎行列
 [L,U,P,Q,R] = lu(A)
 

L*U=P*R*A*Qを満たします。

※ 疎行列にはUMFPACKが使われ、密行列にはLAPACKが使用されます。

  [例]
(1)密行列にlu関数を適用 
--> a = float([1,2,3;4,5,8;10,12,3])

a =

1 2 3
4 5 8
10 12 3

--> [l,u,p] = lu(a)
l =

1.0000 0 0
0.1000 1.0000 0
0.4000 0.2500 1.0000

u =

10.0000 12.0000 3.0000
0 0.8000 2.7000
0 0 6.1250

p =

0 0 1
1 0 0
0 1 0

--> l*u

ans =

10 12 3
1 2 3
4 5 8

--> p*a

ans =

10 12 3
1 2 3
4 5 8
 
(2)疎行列に適用
--> a = sparse([1,0,0,4;3,2,0,0;0,0,0,1;4,3,2,4])

a =
Matrix is sparse with 9 nonzeros
--> [l,u,p,q,r] = lu(a)
l =
Matrix is sparse with 4 nonzeros
u =
Matrix is sparse with 9 nonzeros
p =

4 2 1 3

q =

3 2 1 4

r =
Matrix is sparse with 4 nonzeros
--> full(l*a)

ans =

1 0 0 4
3 2 0 0
0 0 0 1
4 3 2 4

--> b = r*a

b =
Matrix is sparse with 9 nonzeros
--> full(b(p,q))

ans =

0.1538 0.2308 0.3077 0.3077
0 0.4000 0.6000 0
0 0 0.2000 0.8000
0 0 0 1.0000  
 

-------------------------------------------------------------------------------------------------------------------------------------------
eig 固有値分解

  [構文] 
 s = eig(A)
 [V,D] = eig(A)
sは固有値。Vは固有値、Dは固有値ベクトル。上記2つの文法では、入力引数Aが非対称である時balancingがなされる。 
 s = eig(A,'nobalance')
 [V,D] = eig(A,'nobalance')
balancingを無効にする際上記のオプション文字’nobalance’を挿入。 
 s = eig(A,B) 
 [V,D] = eig(A,B) 
一般化された固有値・固有ベクトルは行列ペアA・Bを用いて上記のようにします。 
 
  [例]
 (1)対角行列
 
--> A = diag([1.02f,3.04f,1.53f])

A =

1.0200 0 0
0 3.0400 0
0 0 1.5300

--> eig(A)

ans =

1.0200
1.5300
3.0400

(2)上三角行列

--> A = [1.0f,3.0f,4.0f;0,2.0f,6.7f;0.0f,0.0f,1.0f]

A =

1.0000 3.0000 4.0000
0 2.0000 6.7000
0 0 1.0000

--> eig(A)

ans =

1
2
1

 (3)ここでは正確性を見てみましょう

--> A = float(randn(2))

A =

0.4619 -0.3720
-0.1875 -0.7272

--> [V,D] = eig(A)
V =

0.9888 0.2863
-0.1490 0.9582

D =

0.5179 0
0 -0.7832

--> A*V - V*D

ans =

1.0e-08 *

-5.9605 1.4901
-1.4901 0

(4)balancingを無効とした例(MATLABのマニュアルからの例です)

--> B = [3,-2,-.9,2*eps;-2,4,1,-eps;-eps/4,eps/2,-1,0;-.5,-.5,.1,1]

B =

3.0000 -2.0000 -0.9000 0.0000
-2.0000 4.0000 1.0000 -0.0000
-0.0000 0.0000 -1.0000 0
-0.5000 -0.5000 0.1000 1.0000

--> [VB,DB] = eig(B)
VB =

0.6153 -0.4176 -0.0000 -0.1530
-0.7881 -0.3261 -0.0000 0.1346
-0.0000 -0.0000 0.0000 -0.9790
0.0189 0.8481 1.0000 -0.0097

DB =

5.5616 0 0 0
0 1.4384 0 0
0 0 1.0000 0
0 0 0 -1.0000

--> B*VB - VB*DB

ans =

0.0000 -0.0000 -0.0000 0.0000
-0.0000 -0.0000 0.0000 0.0000
-0.0000 -0.0000 -0.0000 0
-0.0000 0.0000 0 -0.1082

--> [VN,DN] = eig(B,'nobalance')
VN =

0.6153 -0.4176 0.0000 -0.1528
-0.7881 -0.3261 0.0000 0.1345
-0.0000 -0.0000 -0.0000 -0.9781
0.0189 0.8481 -1.0000 0.0443

DN =

5.5616 0 0 0
0 1.4384 0 0
0 0 1.0000 0
0 0 0 -1.0000

--> B*VN - VN*DN

ans =

1.0e-16 *

8.8818 -1.1102 -1.8784 -1.1102
-8.8818 2.7756 0.4454 0.8327
0.1718 0.0154 0.0663 0
-0.6939 0 0 1.1102


-------------------------------------------------------------------------------------------------------------------------------------------
qr QR分解

  [構文]
(non-pivot バージョン) 
 ① コンパクトバージョン
 [q,r] = qr(a,0)
 ※ 入力引数の行列aがM×Nの行列とすると、qはM×N、LはL×N。Lはmin(N,M)。q*r=aが成立する。
qは正規直交、rは上三角行列。
 ② フルバージョン
 [q,r] = qr(a)
 ※ 入力引数の行列aのサイズはM>N。q、r共にサイズはM×N。
(pivot バージョン) 
 ① コンパクトバージョン
 [q,r,e] = qr(a,0) 
 ※ eは整数行列(rの並び替えの際に用いる)
 ② フルバージョン
 [q,r,e] = qr(a)
 ※ q*r*e' = aを満たす。
 
  [例]
--> b=zeros(4)

b =

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

--> c=ones(4)*7

c =

7 7 7 7
7 7 7 7
7 7 7 7
7 7 7 7

--> a=randi(b,c)

a =

4 0 1 7
1 3 0 3
2 3 6 1
2 4 0 5
 
--> [q,r]=qr(a,0)
q =

-0.8000 0.5742 0.1408 -0.1024
-0.2000 -0.4898 0.2780 -0.8018
-0.4000 -0.3462 -0.8484 0.0171
-0.4000 -0.5573 0.4278 0.5885

r =

-5.0000 -3.4000 -3.2000 -8.6000
0 -4.7371 -1.5030 -0.5826
0 0 -4.9498 3.1103
0 0 0 -0.1621
 
--> q*r

ans =

4.0000 0.0000 1.0000 7.0000
1.0000 3.0000 -0.0000 3.0000
2.0000 3.0000 6.0000 1.0000
2.0000 4.0000 -0.0000 5.0000

--> a

ans =

4 0 1 7
1 3 0 3
2 3 6 1
2 4 0 5

-------------------------------------------------------------------------------------------------------------------------------------------

svd 特異値分解

  [構文]
  s = svd(A)
sは特異値。 
 [U,S,V] = svd(A)
対称行列Sの特異値U、V。 
 [U,S,V] = svd(A,0)
よりコンパクトな分解を行います。特異値0に対する左右の特異ベクトルを返します。 
 
  [例] 
--> A = float(randn(2,3))

A =

0.8958 0.6486 -1.7291
-0.4528 -0.4949 -1.3478

--> [U,S,V] = svd(A)
U =

-0.8714 -0.4906
-0.4906 0.8714

S =

2.2618 0 0
0 1.1678 0

V =

-0.2469 -0.7142 0.6550
-0.1425 -0.6418 -0.7535
0.9585 -0.2794 0.0567

--> U*S*V'

ans =

0.8958 0.6486 -1.7291
-0.4528 -0.4949 -1.3478

--> svd(A)

ans =

2.2618
1.1678

-------------------------------------------------------------------------------------------------------------------------------------------
fftn N次FFT

  [構文]
 y = fftn(x)
 y = fftn(x,dims)
dimsはサイズのベクトル。データ長の調節に0挿入や打ち切りなどが施されます。 内部では関数fftが実行されます。

-------------------------------------------------------------------------------------------------------------------------------------------
fftshift シフトFFT

  [構文]
 y = fftshift(x)
 y = fftshift(x,dim) 
 
  [例] 
--> t=0:0.01:1;
--> y=sin(2*pi*10*t);
--> Y=fft(y);
--> subplot(2,1,1),plot(abs(Y))
--> Y_shift=fftshift(Y);
--> subplot(2,1,2),plot(abs(Y_shift))

-------------------------------------------------------------------------------------------------------------------------------------------
hilbert ヒルベルト変換

[構文]
 y = hilbert(x)
出力yは、元の関数と虚部のヒルベルト変換後の信号の合計となります(MATLABも同様)。 
 
[例]
--> a=[1 0 1;1 1 0;0 0 1]

a =

1 0 1
1 1 0
0 0 1

--> hilbert(a)

ans =

1.0000 - 0.5774i 0.0000 - 0.5774i 1.0000 + 0.5774i
1.0000 + 0.5774i 1.0000 - 0.0000i 0.0000 + 0.0000i
0.0000 - 0.0000i 0.0000 + 0.5774i 1.0000 - 0.5774i

 -------------------------------------------------------------------------------------------------------------------------------------------

ifftn N次の逆FFT

  [構文]
 y = ifftn(x)
 y = ifftn(x,dims)
逆DFTを計算します。dimsはサイズを表す行列です。 
 
内部ではifft関数がコールされています。

-------------------------------------------------------------------------------------------------------------------------------------------
ifftshift 逆シフトFFT

  [構文]
 y = ifftshift(x)
 y = ifftshift(x,dim) 
 
  [例]
--> ifftshift([1 1 1 0 0 0])

ans =

0 0 0 1 1 1