我一直在努力将一些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)将是一个向量。
由于
编辑:显然我的描述在解释我的代码示例时过于简短,不能确定我能写的更多内容是否相关而不仅仅是浪费人们的时间。这对过滤先生来说够了吗?
答案 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,以及处理负索引的方式(它们在两种语言中都不起作用)。您需要实现修复以返回正确的索引。