在R中编写自适应函数-输出计算错误

时间:2018-07-18 12:07:05

标签: r matlab

我有两个用MATLAB编写的函数(来自Voicebox工具箱的distitpfdistchpf),我试图将它们转换为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)}

针对MATLAB的测试:

pf1=[2,4,5,6];
pf2=[7,8,9,1];
>> distitpf(pf1,pf2)
ans =
    0.6732
>> distchpf(pf1,pf2)
ans =
    0.6386

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

1 个答案:

答案 0 :(得分:0)

答案出在菲律宾。但是,我会使用seewayproxy库中已经实现的功能:

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
}