2016-05-25 6 views
1

Matlabでその周波数応答をプロットするフィルタがあります。MATLABの要素的な力 - どのように動作するのかわかりません。

フィルタ応答は次のとおりです。私に 'マトリックスの寸法が同意しなければなりません' の種類のエラーを与えて、動作していない

%Freqency_Response_of_wiener_filter 
f = linspace(-1e3,1e3,1e5); 
H = ((2*pi*f)^2+10^6)/(11*(2*pi*f)^2+10^6+10^4); 
plot(f,H); 
xlabel('f') 
ylabel('H(f)') 

:H(f)は= Frequency response of wiener filter

私はそれをプロットすることを試みました。私も試してみました :)ちょうど私が望んでいないものを、この実際にプロット何かを

H = ((2*pi*f).^2+10^6)/(11*(2*pi*f).^2+10^6+10^4); 

: 私はその後、私は必要なものに正確に合うように思わ「要素ごとのパワー」、約読み、にHを変更しました

H = ((2*pi)^2*f.^2+10^6)/(11*(2*pi)^2*f.^2+10^6+10^4); 

運がない。私はそれが働いてしまった 唯一の方法は次のとおりです。

%Freqency_Response_of_wiener_filter 
f = linspace(-1e3,1e3,1e5); 
for i=1:length(f) 
    H(i) = ((2*pi*f(i))^2+10^6)/(11*(2*pi*f(i))^2+10^6+10^4); 
end 
plot(f,H); 

「要素ごとの消費電力は、」私のために働いていないのはなぜ?

それ以上のこと - 通常の操作と「要素ごとの操作」の違いは何ですか?例えば、ここではオーバーなので:この1

a = 0:.01:5; 
b = cos(2*pi*a); 
plot(a,b) 

と::An Introduction to Matlab、そこにこのプロットだ

x = 2:.1:4; 
y = 1./x; 
plot(x,y) 
xlabel('x'); 
ylabel('y'); 

と私はそれらの間の任意の違いを見分けることはできません。最初の1つでは、なぜ要素的な操作の必要はなかったのですが、2番目の要素には何がありましたか?

ありがとうございました。

+2

簡単な経験則:要素の賢明な操作をしたいときは、 '/'、 '*'、 '^'の前にドットをチャックします。どちらもスカラーなので、 '2 * pi'は' 2 * pi'以外の何もしていませんが、少なくとも、これらの種類の見つけにくいエラーをデバッグする手間を省きます。 – Adriaan

+1

私は2番目のアドリアンのコメントです。あなたはスカラーを行列で乗算する必要はありませんが、2つの行列( 'x、y')とスカラー(' k')を使ってデバッグの問題に遭遇するかもしれません: 'x * k'と'k * y'はどちらも動作しますが、' x * k * y'はエラーを引き起こします。ドット/ドットをどこに置くかを決める代わりに、単に 'x。* k。* y'の両方の場所に置くだけです。 –

答えて

3

あなたが./必要があるためH = ((2*pi)^2*f.^2+10^6)/(11*(2*pi)^2*f.^2+10^6+10^4);が機能しなかった理由は次のとおりです。のみがあるので、あなたが要素単位操作を必要としない

a = 0:.01:5; 
b = cos(2*pi*a); 
plot(a,b) 

:最初のケースで

H = ((2*pi)^2*f.^2+10^6)./(11*(2*pi)^2*f.^2+10^6+10^4); 

をベクトルまたは行列の余弦を行う1つの方法です。一方

、別の場合には:

x = 2:.1:4; 
y = x.^2; 
plot(x,y) 
xlabel('x'); 
ylabel('y'); 

あなたは要素ごとの操作を行いたいことを指定ではなく、(だけ正方行列のために働く)それ自体で行列を乗算する必要があります。あなたはポスト第2のケースで

x = 2:.1:4; 
y = 1./x; 
plot(x,y) 
xlabel('x'); 
ylabel('y'); 

MATLABは1は長さnumel(x)を持つもののベクトルなければならないことを理解しているように、あなたは.を必要としています。