【发布时间】:2012-03-04 07:42:24
【问题描述】:
我编写了下面的代码来生成一个矩阵,其中包含对我来说相当复杂的模式。在这种情况下,我通过反复试验确定完成的矩阵中有 136 行。
我可以提前写一个函数来计算矩阵的行数,但是这个函数会有点复杂。在此示例中,矩阵中的行数 = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + (1 * 3 + 1)) * 4。
是否有一种简单有效的方法可以在 R 中创建矩阵,而无需硬连线矩阵语句中的行数?换句话说,有没有一种简单的方法可以让 R 在使用 for 循环时根据需要简单地将一行添加到矩阵中?
我提出了一种解决方案,它在每次通过循环时都使用 rbind,但这似乎有点令人费解,我想知道是否有更简单的解决方案。
对不起,如果这个问题与之前的问题是多余的。我今天无法使用本网站上的搜索功能或使用互联网搜索引擎找到类似的问题,但我想我过去曾在某处发现过类似的问题。
以下是 2 组示例代码,一组使用 rbind,另一组我使用反复试验来提前设置 nrow=136。
感谢您的任何建议。
v1 <- 5
v2 <- 2
v3 <- 2
v4 <- (v1-1)
my.matrix <- matrix(0, nrow=136, ncol=(v1+4) )
i = 1
for(a in 1:v2) {
for(b in 1:v3) {
for(c in 1:v4) {
for(d in (c+1):v1) {
if(d == (c+1)) l.s = 4
else l.s = 3
for(e in 1:l.s) {
my.matrix[i,c] = 1
if(d == (c+1)) my.matrix[i,d] = (e-1)
else my.matrix[i,d] = e
my.matrix[i,(v1+1)] = a
my.matrix[i,(v1+2)] = b
my.matrix[i,(v1+3)] = c
my.matrix[i,(v1+4)] = d
i <- i + 1
}
}
}
}
}
my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4) )
my.matrix3 <- matrix(0, nrow=1, ncol=(v1+4) )
i = 1
for(a in 1:v2) {
for(b in 1:v3) {
for(c in 1:v4) {
for(d in (c+1):v1) {
if(d == (c+1)) l.s = 4
else l.s = 3
for(e in 1:l.s) {
my.matrix2[1,c] = 1
if(d == (c+1)) my.matrix2[1,d] = (e-1)
else my.matrix2[1,d] = e
my.matrix2[1,(v1+1)] = a
my.matrix2[1,(v1+2)] = b
my.matrix2[1,(v1+3)] = c
my.matrix2[1,(v1+4)] = d
i <- i+1
if(i == 2) my.matrix3 <- my.matrix2
else my.matrix3 <- rbind(my.matrix3, my.matrix2)
my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4) )
}
}
}
}
}
all.equal(my.matrix, my.matrix3)
【问题讨论】:
-
这是'The R Inferno'burns-stat.com/pages/Tutor/R_inferno.pdfCircle 2 的主题@你是正确的避免连续的 rbinding 或 cbinding。
标签: r