MATLAB到R的转换:通过for循环将值附加到现有的空数组
我随身携带以下代码。这段代码最初是用MATLAB编写的。我这里有两个问题: 1) 对于MATLAB中的以下命令,R中的相应命令是什么: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值,但我无法获得
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)
}
}