开发者

translating matlab script to R

I've just been working though converting some MATLAB scripts to work in R, however having never used MATLAB in my life, and not exactly being an expert on R I'm having some trouble.

Edit: It's a script I was given designed to correct temperature measurements for lag generated by insulation mass effects. My understanding is that It looks at the rate of change of the temperature and attempts to adjust for errors generated by the response time of the sensor. Unfortunately there is no literature available to me to give me an indication of the numbers i am expecting from the function, and the only way to find out will be to experimentally test it at a later date.

the original script:

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

where I've managed to get to:

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)
}

I think the problem is the Comp[k] line, could someone point out what I've done wrong? I'm not sure I can select the elements of the array in such a way.

by the way, Tau = 1, t = 0.5 and temp (or T0) will be a vector.

Thanks

edit: apparently my description is too brief in explaining my code samples, not really开发者_开发知识库 sure what more I could write that would be relevant and not just wasting peoples time. Is this enough Mr Filter?


The error is as follows:

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

If you write print(i - (ceiling(N/2)) + k) before that line, you will see that you are using incorrect indices for temp[i - (ceiling(N/2)) + k], which means that nothing is returned to be inserted into Comp[k]. I assume this problem is due to Matlab allowing the use of 0 as an index and not R, and the way negative indices are handled (they don't work the same in both languages). You need to implement a fix to return the correct indices.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜