TL; DR - ここでコンパクトでベクトル化方法の両方である:
t = 2*pi;
myfun = @(k,a) (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
k = 0:30; % here you can add as many k's you like
w = linspace(-1,10,5000).^2.';
b0 = zeros(size(w));
B = bsxfun(myfun,k,w);
plot(w,[b0 B],'.')
grid on
結果:
の
説明:
あなたのコードでは、変数を使用しないでください方法を示しています。 a01==a02==a03...
の場合は、すべての場合にa
を使用することができます。そのすべてを定義する必要はありません。a
b0
、b01
なども同様ですが、それを行う無名関数(関数の最短タイプ)を定義して繰り返し呼び出すことができます。上記の2つのことを行うと、上のコード(プロットなし)は次のようになります。
w = linspace(-1,10,5000);
t = 2*pi;
b_fun = @(k,a) (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
a = w.^2;
k = 0;
b0 = b_fun(k,a);
b = a*0;
k1 = 1;
b01 = b_fun(k1,a);
k2=2;
b02 = b_fun(k2,a);
k3=3;
b03 = b_fun(k3,a);
k4 = 4;
b04 = b_fun(k4,a);
k5 = 5;
b05 = b_fun(k5,a);
どれが短く読みやすくなっていますか。関数の前にt
を定義しているので、関数内の値によって計算されます。
次は、一つのコマンドで(とベクトル化の方法で)すべてのペアごとのa
からの要素の組み合わせとあなたのk
年代を計算するためにsingleton expansionを使用することができます。
k = 0:5
B = bsxfun(b_fun,k,a.');
これは、各列がある行列を作成しますすべての結果はb_fun(k(i),a)
です。 bsxfun
への最初の入力は、私たちの関数b_fun
のような要素ごとのバイナリ操作です。次に、常に2つの配列(そのうちの1つはスカラーでもよい)があり、最初のものは関数の最初の引数のすべての値を保持し、2番目の引数は2番目の引数のためのものです。いずれかの配列のシングルトンディメンションが1より大きい場合、bsxfun
は、大きいものに適合するように小さい方を展開します。我々のケースでは、k
はシングルトンの行であり、a
はシングルトンの列であるため、結果にはno。k
からの列と、行の数はa
です。
だからここまで私たちが得た:
w = linspace(-1,10,5000);
t = 2*pi;
b_fun = @(k,a) (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
a = w.^2;
k = 0:5;
B = bsxfun(b_fun,k,a.');
b = a*0;
を我々はさらに行くと、いくつかの重複の変数を削除することができます - w.^2
の代わりa
を使用し、0.5
によって一定pi/t
を交換してください。また、それは代わりにa*0
の、b = zeros(size(w))
を書くことより明らかだ:
w = linspace(-1,10,5000).';
b_fun = @(k,a) (-1).^k.*a-((-1).^k).*(k*0.5).^2;
k = 0:5;
B = bsxfun(b_fun,k,w.^2);
b = zeros(size(w));
を今すぐプロットします。 plot
は1つの行列の列のデータのいくつかのシリーズを取り、同じ変数に対してそれらのすべてを表示するので、我々は、直接私たちのB
を使用することができ、そしてそれb
にCONCATことができます。
plot(w.^2,[b B],'.')
を試してみてくださいコードレビューのコードならばあなたはそれを最適化したいと思っています。 –
上記のコメントはhttp://codereview.stackexchange.com/を参照しています –
は動作しませんか?それはあなたが試したものと動作しなかったものとあなたが受け取ったエラーメッセージを伝えるものです。特にループの文書化にも慣れてください。 –