将matlab脚本翻译为R.

时间:2011-09-23 16:02:48

标签: r matlab

我一直在努力将一些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)
}

我认为问题是Comp [k]行,有人能指出我做错了什么吗?我不确定我是否可以这样选择阵列的元素。

顺便说一句,Tau = 1,t = 0.5,temp(或T0)将是一个向量。

由于

编辑:显然我的描述在解释我的代码示例时过于简短,不能确定我能写的更多内容是否相关而不仅仅是浪费人们的时间。这对过滤先生来说够了吗?

1 个答案:

答案 0 :(得分: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,以及处理负索引的方式(它们在两种语言中都不起作用)。您需要实现修复以返回正确的索引。