TL;博士 - 這是一種體積小,矢量方式:
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
等也是如此,您可以定義一個匿名函數(最短類型的函數),然後一遍又一遍地調用它。如果你只是做兩件事情你上面的代碼(沒有繪製)變爲:
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
,因此它是通過函數內的值計算的。
接下來,你可以使用singleton expansion來計算所有成對元素從a
和你k
的一個命令的組合(和一個矢量方式):
k = 0:5
B = bsxfun(b_fun,k,a.');
這將創建一個矩陣,其中每列所有結果值爲b_fun(k(i),a)
。 bsxfun
的第一個輸入是任何基於元素的二進制操作,如我們的功能b_fun
。接下來總是有2個數組(其中一個數組可以是標量),第一個數組包含函數中第一個參數的所有值,第二個數組用於第二個參數。如果其中一個陣列具有單個維度,而另一個維度大於一個,則比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
。此外,它更清楚寫b = zeros(size(w))
,而不是a*0
:
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
可以採取幾個系列數據的一個矩陣的列,並顯示他們都對同一個變量,所以我們可以直接使用我們的B
,只是CONCAT它b
:
plot(w.^2,[b B],'.')
嘗試代碼審查,如果你的代碼正在工作,但你想優化它。 –
上面的評論是指http://codereview.stackexchange.com/ –
不起作用?這就是你應該告訴你所嘗試和沒有工作的東西以及你收到的錯誤信息。還要熟悉特別是循環的文檔。 –