在R中写入自适应函数-输出计算中的错误
我有两个用MATLAB编写的函数(在R中写入自适应函数-输出计算中的错误,r,matlab,R,Matlab,我有两个用MATLAB编写的函数(distitpf和distchpf,来自voicebox工具箱),我试图将它们转换为R。这些函数计算Itakura距离和COSH距离。下面是这些函数的代码,以及我到目前为止在R中编写的代码。我的问题是,当我测试R函数时,我得到了一个错误。你知道错误是什么以及如何解决吗 MATLAB中的函数: function d=distitpf(pf1,pf2) [nf1,p2]=size(pf1); p1=p2-1; nf2=size(pf2,1); nx=min(nf
distitpf
和distchpf
,来自voicebox工具箱),我试图将它们转换为R。这些函数计算Itakura距离和COSH距离。下面是这些函数的代码,以及我到目前为止在R中编写的代码。我的问题是,当我测试R函数时,我得到了一个错误。你知道错误是什么以及如何解决吗
MATLAB中的函数:
function d=distitpf(pf1,pf2)
[nf1,p2]=size(pf1);
p1=p2-1;
nf2=size(pf2,1);
nx=min(nf1,nf2);
r=pf1(1:nx,:)./pf2(1:nx,:);
q=log(r);
d=log((sum(r(:,2:p1),2)+0.5*(r(:,1)+r(:,p2)))/p1)-(sum(q(:,2:p1),2)+0.5*(q(:,1)+q(:,p2)))/p1;
end
function d=distchpf(pf1,pf2)
[nf1,p2]=size(pf1);
p1=p2-1;
nf2=size(pf2,1);
nx=min(nf1,nf2);
r=pf1(1:nx,:)./pf2(1:nx,:);
q=r+r.^(-1);
d=(2*sum(q(:,2:p1),2)+q(:,1)+q(:,p2))/(4*p1)-1;
end
R中的功能:
distitpf <- function(pf1,pf2){
nf1=nrow(pf1)
p2=length(pf1);
p1=p2-1;
nf2=nrow(pf2);
nx=min(nf1,nf2);
r=pf1[1:nx,]/pf2[1:nx,];
qx=log(r);
d=log((sum(r[,2:p1],2)+0.5*(r[,1]+r[,p2]))/p1)-(sum(qx[,2:p1],2)+0.5*(qx[,1]+qx[,p2]))/p1;
return(d)}
distchpf <- function(pf1,pf2) {
nf1=nrow(pf1)
p2=length(pf1);
p1=p2-1;
nf2=nrow(pf2);
nx=min(nf1,nf2);
r=pf1[1:nx,]/pf2[1:nx,];
qx=r+r^(-1);
d=(2*sum(qx[,2:p1],2)+qx[,1]+qx[,p2])/(4*p1)-1;
return(d)}
R的测试:
pf1=c(2,4,5,6);
pf2=c(7,8,9,1);
> distchpf(pf1,pf2)
Error in 1:nx : result would be too long a vector
In addition: Warning message:
In min(nf1, nf2) : no non-missing arguments to min; returning Inf
> distitpf(pf1,pf2)
Error in 1:nx : result would be too long a vector
In addition: Warning message:
In min(nf1, nf2) : no non-missing arguments to min; returning Inf
(编辑)
我已经解决了这个问题。我将更正后的R代码贴在下面
distitpf <- function(pf1,pf2){
pf1<-as.matrix(pf1)
pf2<-as.matrix(pf2)
nf1=nrow(pf1)
p2=length(pf1);
p1=p2-1;
nf2=nrow(pf2);
nx=min(nf1,nf2);
r=pf1/pf2
qx=log(r);
d=log((sum(r[2:p1])+0.5*(r[1]+r[p2]))/p1)-(sum(qx[2:p1])+0.5*(qx[1]+qx[p2]))/p1;
return(d)}
distchpf <- function(pf1,pf2) {
pf1<-as.matrix(pf1)
pf2<-as.matrix(pf2)
nf1=nrow(pf1)
p2=length(pf1);
p1=p2-1;
nf2=nrow(pf2);
r=pf1/pf2;
qx=r+r^(-1);
d=(2*sum(qx[2:p1])+qx[1]+qx[p2])/(4*p1)-1;
return(d)}
distitpf菲利帕给出了答案。但是,我会使用seeway
和proxy
库中已经实现的函数:
distitpf <- function(pf1, pf2) {
pf1 <- as.matrix(pf1)
pf2 <- as.matrix(pf2)
nf1 <- nrow(pf1)
p2 <- length(pf1)
p1 <- p2 - 1
nf2 <- nrow(pf2)
nx <- min(nf1, nf2)
r <- pf1 / pf2
qx <- log(r)
log((sum(r[2:p1]) + 0.5 * (r[1] + r[p2])) / p1) - (sum(qx[2:p1]) + 0.5 * (qx[1] + qx[p2])) / p1
}
distchpf <- function(pf1, pf2) {
pf1 <- as.matrix(pf1)
pf2 <- as.matrix(pf2)
nf1 <- nrow(pf1)
p2 <- length(pf1)
p1 <- p2 - 1
nf2 <- nrow(pf2)
r <- pf1 / pf2
qx <- r + 1 / r
(2 * sum(qx[2:p1]) + qx[1] + qx[p2]) / (4 * p1) - 1
}
distitpf错误是什么,由R非常清楚地列出。是的,但我如何解决它?您的输入(两个向量)没有任何行。查看nrow(pf1)
返回的内容。只有类似矩阵的对象才有行。你说得对。谢谢你的邀请help@Filipa,你能告诉我自己写这个函数的原因吗。看起来它们可以在seewave
或proxy
库中找到?
distitpf <- function(pf1, pf2) {
pf1 <- as.matrix(pf1)
pf2 <- as.matrix(pf2)
nf1 <- nrow(pf1)
p2 <- length(pf1)
p1 <- p2 - 1
nf2 <- nrow(pf2)
nx <- min(nf1, nf2)
r <- pf1 / pf2
qx <- log(r)
log((sum(r[2:p1]) + 0.5 * (r[1] + r[p2])) / p1) - (sum(qx[2:p1]) + 0.5 * (qx[1] + qx[p2])) / p1
}
distchpf <- function(pf1, pf2) {
pf1 <- as.matrix(pf1)
pf2 <- as.matrix(pf2)
nf1 <- nrow(pf1)
p2 <- length(pf1)
p1 <- p2 - 1
nf2 <- nrow(pf2)
r <- pf1 / pf2
qx <- r + 1 / r
(2 * sum(qx[2:p1]) + qx[1] + qx[p2]) / (4 * p1) - 1
}