我正在試圖將這個Savitzky-Golay函數從Matlab轉換爲R.但是它在R.中不起作用。如何使R函數工作?將Savitzky-Golay函數從Matlab轉換爲R
X例如可以在這裏下載:https://drive.google.com/open?id=0B5AOSYBy_josMUgtRi1wLW4tZEE
功能輸入是:
- X(MXN)的數據來處理
- 寬度(1×1)個
- 順序的號碼( 1 x 1)多項式order
- deriv(1 x 1)衍生訂單
功能的輸出是:
- XSG(MXN)的處理過的數據
Atacched是從Matlab的實施例和R:
--- --- MATLAB
function [xsg]= savgol(x,width,order,deriv)
[m,n]=size(x);
w=max(3, 1+2*round((width-1)/2));
o=min([max(0,round(order)),5,w-1]);
d=min(max(0,round(deriv)),o);
p=(w-1)/2;
xc=((-p:p)'*ones(1,1+o)).^(ones(size(1:w))'*(0:o));
we=xc\eye(w);
b=prod(ones(d,1)*[1:o+1-d]+[0:d-1]'*ones(1,o+1-d,1),1);
di=spdiags(ones(n,1)*we(d+1,:)*b(1),p:-1:-p,n,n);
w1=diag(b)*we(d+1:o+1,:);
di(1:w,1:p+1)=[xc(1:p+1,1:1+o-d)*w1]';
di(n-w+1:n,n-p:n)=[xc(p+1:w,1:1+o-d)*w1]';
xsg=x*di;
plot(xsg')
--- R ---
savgol=function(x,width,order,deriv)
{
m=nrow(x)
n=ncol(x)
w=max(3,1+2*round((width-1)/2))
o=min(c(max(0,round(order)),5,w-1))
d=min(max(0,round(deriv)),o)
p=(w-1)/2
xc=((-p:p)%*%matrix(1,1,1+o))^(t(matrix(1,1,w))%*%(0:o))
we=qr.solve(xc,diag(w))
b=apply((matrix(1,d,1)%*%matrix(1:(o+1-d),1,(o+1-d))+t(matrix(0:(d-1),1,(d)))%*%matrix(1,1,o+1-d)),2,prod)
gg=matrix(1,n,1)%*%we[(d+1),]*b[1]
library(Matrix)
di=sparseMatrix(i=1:n,j=1:n,x=gg)
w1=diag(b,nrow=length(b))%*%we[(d+1):(o+1),]
di[1:w,1:(p+1)]=t(xc[1:(p+1),1:(1+o-d)]%*%w1)
di[(n-w+1):n,(n-p):n]=t(xc[(p+1):w,1:(1+o-d)]%*%w1)
xsg=x%*%di
}
matplot(t(xsg),type='l')
個
在一個專用代碼的形式在兩個不同的語言產生問題比較意味着您將受衆限制在兩種語言的便捷用戶之間。您需要在每個代碼段中包含註釋,以深入描述每行代碼的特定目標和期望。 (空間會提高可讀性。) –
'install.packages(「sos」,dep = TRUE); findFn(「Savitzky-Golay」)' – 2015-10-06 05:11:22
我不確定,但R不是MatLab中的圓形行爲嗎? 1.5可能捨入爲2,而0.5在R中舍入爲0? – Stefan