2011-09-23 90 views
-1

我剛剛工作,雖然把一些MATLAB程序R中工作,但從來沒有使用過MATLAB在我的生活,而不是被準確R上我有一些麻煩的專家。翻譯MATLAB腳本至R

編輯:這是我得到了旨在糾正溫度測量通過絕緣質量效應產生滯後的腳本。我的理解是,它會查看溫度的變化率,並嘗試調整傳感器響應時間產生的誤差。不幸的是,我沒有任何文獻可以讓我指出我期望從函數中得到的數字,唯一能找到的方法是在稍後的日期進行實驗性測試。

原始腳本:

function [Tc, dT] = CTD_TempTimelagCorrection(T0,Tau,t) 
N1 = Tau/t; 
Tc = T0; 
    N = 3; 

    for j=ceil(N/2):numel(T0)-ceil(N/2) 

     A = nan(N,1); 
     # Compute weights 
     for k=1:N 
      A(k) = (1/N) + N1 * ((12*k - (6*(N+1)))/(N*(N^2 - 1))); 
     end 
     A = A./sum(A); 

     # Verify unity 
     if sum(A) ~= 1 
      disp('Error: Sum of weights is not unity'); 
     end 

     Comp = nan(N,1); 
     # Compute components 
     for k=1:N 
      Comp(k) = A(k)*T0(j - (ceil(N/2)) + k); 
     end 


     Tc(j) = sum(Comp); 
     dT = Tc - T0;  
    end 

,我已經成功地得到:

CTD_TempTimelagCorrection <- function(temp,Tau,t){ 

## Define which equation to use based on duration of lag and frequency 
## With ESM2 profiler sampling @ 2hz: N1>tau/t = TRUE 

N1 = Tau/t 
Tc = temp 
N = 3 

for(i in ceiling(N/2):length(temp)-ceiling(N/2)){ 
    A = matrix(nrow=N,ncol=1) 
    # Compute weights 
    for(k in 1:N){ 
     A[k] = (1/N) + N1 * ((12*k - (6*(N+1)))/(N*(N^2 - 1))) 
    } 
    A = A/sum(A) 

    # Verify unity 
    if(sum(A) != 1){ 
    print("Error: Sum of weights is not unity") 
    } 

    Comp = matrix(nrow=N,ncol=1) 
    # Compute components 
    for(k in 1:N){ 
     Comp[k] = A[k]*temp[i - (ceiling(N/2)) + k] 
    } 

    Tc[i] = sum(Comp) 
    dT = Tc - temp 
} 
return(dT) 
} 

我認爲這個問題是比較[K]行,可能有人指出什麼我做錯了嗎?我不確定我能否以這種方式選擇數組的元素。

順便說一下,牛頭= 1,T = 0.5和臨時(或T0)將是一個向量。

感謝

編輯:顯然我的描述是解釋我的代碼示例太簡單了,真的不知道還有什麼我可以寫這將是相關的,不只是浪費人民的時間。這是否足夠先生過濾器?

+1

顯然,[據傳](http://blog.stackoverflow.com/2011/09/se-podcast-19/)變更已實現,並且這個問題的「這裏代碼的非常模型。你修好了。'題。因此提示寫更多。 – joran

+2

關於函數應該做什麼的信息以及輸入和輸出的例子將是最有幫助的。另外,你說你認爲Comp [k]有問題,但你不會說它是什麼。你爲什麼不寫這個函數,以便函數中的變量名都是一樣的?這會讓其他人更容易遵循......我注意到的第一件事是他在你的'for'循環中的向量不能正確計算,':'運算符的優先級高於你 – John

+0

您是否有權訪問matlab和R,以便您可以測試兩個版本的腳本?打印出正在發生的事情(或使用每個平臺的調試系統)並查看事情的不同之處 – Spacedman

回答

2

的錯誤如下:

Error in Comp[k] = A[k] * temp[i - (ceiling(N/2)) + k] : 
    replacement has length zero 
In addition: Warning message: 
In Comp[k] = A[k] * temp[i - (ceiling(N/2)) + k] : 
    number of items to replace is not a multiple of replacement length 

如果你在該行之前寫print(i - (ceiling(N/2)) + k),你會看到你正在使用不正確指數temp[i - (ceiling(N/2)) + k],這意味着沒有返回到插入Comp[k]。我認爲這個問題是由於Matlab允許使用0作爲索引而不是R,以及處理負指數的方式(它們在兩種語言中不起作用)。您需要實施修復以返回正確的索引。

+0

哇感謝,應該是好去一個解決辦法, – BetaScoo8

+0

我定盤放置 比較[K] =代碼A *臨時[I [K] - (上限(N/2))+ k] 如果長度> 0檢查。 – BetaScoo8