перевод сценария Matlab на R - PullRequest
       7

перевод сценария Matlab на R

0 голосов
/ 23 сентября 2011

Я только что работал, хотя и конвертировал некоторые скрипты 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 Ответ

2 голосов
/ 23 сентября 2011

Ошибка выглядит следующим образом:

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, и способ обработки отрицательных индексов (они не работают одинаково на обоих языках). Вам нужно внедрить исправление, чтобы вернуть правильные индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...