2015-04-15 18 views
0

讓我們說,從給定函數f(t),我們要構建是從存在功能通過這種方式賦予了新的功能從給定函數生成周期函數

enter image description here

其中T是一些恆定的讓利說T = 3;當然K可不能從負無窮大到現實中無窮,因爲我們不能使用計算機做無限求和,所以它首先我買得起

首先讓我們來定義我們的函數

function y=f(t); 
y=-1/(t^2); 
end 

和第二程序

k=-1000:1:999; 
F=zeros(1,length(k)); 
T=3; 
for t=1:length(k) 
F(t)=sum(f(t+k*T)); 
end 

,但是當我運行第二個程序,我得到

>> program 
Error using^
Inputs must be a scalar and a square matrix. 
To compute elementwise POWER, use POWER (.^) instead. 

Error in f (line 2) 
y=-1/(t^2); 

Error in program (line 5) 
F(t)=sum(f(t+k*T)); 

小號我錯

1.首先是什麼錯誤,爲什麼它顯示

  • 我怎樣才能做到這一點在Excel中:○我有兩個問題與此相關的計劃?我可以簡化它嗎?在此先感謝
  • 編輯:

    我已經通過這種方式

    k=-1000:1:999; 
    F=zeros(1,length(k)); 
    T=3; 
    for t=1:length(k) 
        result=0; 
        for l=1:length(k) 
         result=result+f(t+k(l)*T); 
        end 
        F(t)=result; 
    end 
    

    是好的改變了我的代碼?

    +1

    運算符'+, - ,*,/,^,...'是矩陣運算符。如果你想做元素操作,你需要使用相應的元素運算符:。+,.-,。*,./,。^,...',當然當然不需要'+'和'-' 。 – patrik

    +0

    我已更新我的代碼,請參閱 –

    +1

    您的函數'y'需要將元素方式的權力應用於元素:'y = -1 /(t。^ 2);'。 – rayryeng

    回答

    4

    要以矢量化方式解決您的問題,您必須更改函數f,以便可以使用矢量作爲輸入來調用它。正如@帕特里克建議的那樣,這是通過使用元素明智的運營商.* ./ .^(Afaik,沒有.+ .-存在)來實現的。不幸的是,@rayryeng的評論並不完全正確,這可能會導致混淆。正確的方法是使用元素方面的運營商既分工./廣場.^

    function y = f(t) 
        y = -1 ./ (t.^2); 
    end 
    

    現有的代碼(第一版)

    k = -1000:1:999; 
    F = zeros(1,length(k)); 
    T = 3; 
    for t=1:length(k) 
        F(t) = sum(f(t+k*T)); 
    end 
    

    然後按預期工作(和比你在編輯中發佈的版本快得多)。

    您甚至可以取消for循環並使用arrayfun代替。對於簡單功能f,您也可以使用function handles而不是創建單獨的文件。這給出了

    f = @(t) -1 ./ (t.^2); 
    k = -1000:1:999; 
    t = 1:2000; 
    T = 3; 
    F = arrayfun(@(x)sum(f(x+k*T)), t); 
    

    和更快,並且是一個簡單的單線程。 arrayfun將任何函數句柄作爲第一個輸入。我們創建一個函數句柄,其參數爲x,並且總和爲k@(x) sum(f(x+k*T)。第二個參數,矢量t包含了函數句柄評估的所有值。

    正如意見提出@Divakar,您還可以使用bsxfun功能:

    f = @(t) -1 ./ (t.^2); 
    k = -1000:1:999; 
    t = 1:2000; 
    T = 3; 
    F = sum(f(bsxfun(@plus,k*T,t.')),2); 
    

    其中bsxfun創建一個包含tk*T之間的所有組合的矩陣,它們都使用評估和f(...)去年,該沿第二維的sum總計超過所有k的總和。


    標杆

    讓我們比較這些解決方案:

    1. for環和sum(原來的問題)的組合:

      經過時間0.043969秒。

    2. 經過在2個for環(編輯問題)的所有組合:

      經過時間1.367181秒。

    3. 矢量化方法與arrayfun

      經過時間0.063748秒。與bsxfun提議@Divakar

    4. 矢量化的方法:

      經過時間0.099399秒。

    所以(可悲)包括for循環中的第一溶液節拍都向量化的方法。對於較大的k載體(-10000:1:9999),可以複製此行爲。結論似乎是,MATLAB確實已經學會了如何優化for循環。

    +2

    用'F = sum(f(bsxfun(@ plus,k * T,[1:length(k)]')丟失循環。 – Divakar

    +0

    非常感謝,我不知道arrayfun –

    +1

    @Divakar那裏很好!非常有趣。 – patrik