Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB到R的转换:通过for循环将值附加到现有的空数组_R_Matlab - Fatal编程技术网

MATLAB到R的转换:通过for循环将值附加到现有的空数组

MATLAB到R的转换:通过for循环将值附加到现有的空数组,r,matlab,R,Matlab,我随身携带以下代码。这段代码最初是用MATLAB编写的。我这里有两个问题: 1) 对于MATLAB中的以下命令,R中的相应命令是什么: duet(i).p = []; 2) 在下面的代码中,我得到了duet$n的所有正确的6个值,但没有得到duet$p的正确值。我的问题是如何通过for循环迭代将值附加到R中的空现有数组duet$p[i] 此行在以下代码中不起作用: duet$p[i] <- c(duet$p[i],j) 在R中,我正确地获得了duet$n值,但我无法获得

我随身携带以下代码。这段代码最初是用MATLAB编写的。我这里有两个问题:

1) 对于MATLAB中的以下命令,R中的相应命令是什么:

   duet(i).p = [];    
2) 在下面的代码中,我得到了
duet$n
的所有正确的6个值,但没有得到
duet$p
的正确值。我的问题是如何通过for循环迭代将值附加到R中的空现有数组
duet$p[i]

此行在以下代码中不起作用:

duet$p[i] <- c(duet$p[i],j) 
在R中,我正确地获得了
duet$n
值,但我无法获得
duet$p
的数组类型的结果

如需获得
二重唱$p
的任何帮助,将不胜感激

x <- matrix(c(-1,2,4,1,7,4.2,3,0,1.2,-1.2,5.1,4,2,3.1,1.1,1,1,9,0,1,2,2,8,1,2,2,2,2,2,2),nrow=6,ncol=5,byrow=T)  
fro=1;N=6;M=2;V=3;
F <- list(f=c())
duet = list()
for (i = 1 : N){
duet$n[i] = 0
duet$p[i] = array()  ## Create an empty array
       for (j in 1 : N){
          dl = 0
          de = 0
          dm = 0
             for (k = 1 : M){
                 if (x[i,V + k] < x[j,V + k]){
                      dl = dl + 1
                 } else if (x[i,V + k] == x[j,V + k]){
                      de = de + 1
                 } else{
                      dm = dm + 1
             }
       }
    if (dl == 0 & de != M){
        duet$n[i] = duet$n[i] + 1
    } else if (dm == 0 & de != M){
        duet$p[i] = c(duet$p[i],j)
    }
}   
if (duet$n[i] == 0){
    x[i,6] = 1
    F$f = c(F$f,i)
}
}

x我想你是想做
二重唱[I]$p
而不是你在做什么。此外,您还需要将每个单元格初始化为一个列表

这似乎可以获得您想要的输出:

x <- matrix(c(-1,2,4,1,7,4.2,3,0,1.2,-1.2,5.1,4,2,3.1,1.1,1,1,9,0,1,2,2,8,1,2,2,2,2,2,2),nrow=6,ncol=5,byrow=T)  
fro=1;N=6;M=2;V=3;
F <- list(f=c())
duet = list(n=rep(0,N), p=lapply(1:N, function(x)c()))
for (i in 1 : N){
  duet$n[i] = 0
  #duet$p[[i]] = c()  ## Create an empty array
  #if(i==2) browser()
  for (j in 1 : N){
    k=1:M
    dl <- sum(x[i,V + k] < x[j,V + k])
    de <- sum(x[i,V + k] == x[j,V + k])
    dm <- sum(x[i,V + k] > x[j,V + k])

    if (dl == 0 & de != M){
      duet$n[i] = duet$n[i] + 1
    } else if (dm == 0 & de != M){
      duet$p[[i]] = c(duet$p[[i]],j)
    }
  }   
  if (duet$n[i] == 0){
    #x[i,6] = 1
    F$f = c(F$f,i)
  }
}

x“通过for循环将值附加到现有空数组”1)您应该尽最大努力找到循环的矢量化替代方案。2) 如果您知道或能够估计对象的最终大小,则永远不应该在循环中增长对象(这是任何编程语言中最慢的操作之一)。预分配和填充数据结构。不管怎样,不要对MATLAB代码进行严格的翻译,而是考虑代码在做什么,以R-ISH方式重写它,并测试R代码是否给出了相同的结果。这不是答案。充其量只是一个评论。谢谢你,那部分做得很好。我已经按照我的要求对x[I,6]=1进行了编辑。重要的是宣布二重唱$p。尝试学习您使用的一些命令。如果我完全理解了这一点,那么只有我才能跳转到脚本的下一部分。我从中学到了很多东西。:)再次感谢你!!
x <- matrix(c(-1,2,4,1,7,4.2,3,0,1.2,-1.2,5.1,4,2,3.1,1.1,1,1,9,0,1,2,2,8,1,2,2,2,2,2,2),nrow=6,ncol=5,byrow=T)  
fro=1;N=6;M=2;V=3;
F <- list(f=c())
duet = list(n=rep(0,N), p=lapply(1:N, function(x)c()))
for (i in 1 : N){
  duet$n[i] = 0
  #duet$p[[i]] = c()  ## Create an empty array
  #if(i==2) browser()
  for (j in 1 : N){
    k=1:M
    dl <- sum(x[i,V + k] < x[j,V + k])
    de <- sum(x[i,V + k] == x[j,V + k])
    dm <- sum(x[i,V + k] > x[j,V + k])

    if (dl == 0 & de != M){
      duet$n[i] = duet$n[i] + 1
    } else if (dm == 0 & de != M){
      duet$p[[i]] = c(duet$p[[i]],j)
    }
  }   
  if (duet$n[i] == 0){
    #x[i,6] = 1
    F$f = c(F$f,i)
  }
}