2014-02-13 275 views
1

這是一個循環問題,我無法完全理解。使用for循環填充矩陣R

我希望矩陣(w)的每一行在矩陣(mat)中重複填充時間「d」。 matrix(run)就是這樣,我可以通過記錄通過矩陣(w)運行的值來檢查我的循環是否正確運行。


這裏是我的代碼現在:

x<-c(0,0,0,0) 
y<-c(0,0,0,0) 
z<-c(10,50,100,150) 
a<-8 
b<-4 
d<-5 

w<-cbind(x,y,z) 

run<-matrix(0, ncol=3, nrow=d, byrow=T) 
for(h in 1:d){ 

    mat<-matrix(0, ncol=3, nrow=a, byrow=T) 
    for(j in 1:a){ 
    for(i in 1:b){ 
     mat[j,]<- w[i,] 
    } 
    } 
    run[h,]<-mat[1,] 
} 

肯定有一些錯誤,我在矩陣(MAT)填充,因爲我輸入相同的值反覆而不是按順序的方式。在這種情況下,正確的語法應該是什麼?


編輯:抱歉,澄清。我想運行循環5次,併爲每次運行創建一個矩陣(mat)(見下文),其中填充隨後的矩陣(w)行。

V1 V2 V3 
1 0 0 10 
2 0 0 10 
3 0 0 10 
4 0 0 10 
5 0 0 10 


V1 V2 V3 
1 0 0 50 
2 0 0 50 
3 0 0 50 
4 0 0 50 
5 0 0 50 

等等...

+1

'w [rep(1:nrow(w),each = d),]'? – Henrik

回答

3

要創建矩陣列表:

lapply(1:nrow(w), function(x) w[rep(x, each = d), ]) 


# [[1]] 
#  x y z 
# [1,] 0 0 10 
# [2,] 0 0 10 
# [3,] 0 0 10 
# [4,] 0 0 10 
# [5,] 0 0 10 
# 
# ... 
# 
# [[4]] 
#  x y z 
# [1,] 0 0 150 
# [2,] 0 0 150 
# [3,] 0 0 150 
# [4,] 0 0 150 
# [5,] 0 0 150 
+0

我希望能夠使用循環做到這一點,但我想我必須修改我的想法。對不起另一個問題,但我應該如何將每個輸出保存爲一個單獨的矩陣? As.matrix代替了我的列表。 – Mengll

+0

列表是一種更好的方法來保存它們,但是如果要將每個矩陣保存在一個新的變量名稱下,可以將它們作爲'mat [[1]],mat [[2]]'等來訪問。 – harkmug

+0

完美, 謝謝! – Mengll

2

嘗試:

mat <- do.call("rbind", lapply(1:nrow(w), function(x) matrix(rep(w[x,],d), nrow=d, byrow=T))) 
     [,1] [,2] [,3] 
[1,] 0 0 10 
[2,] 0 0 10 
[3,] 0 0 10 
[4,] 0 0 10 
[5,] 0 0 10 
[6,] 0 0 50 
[7,] 0 0 50 
[8,] 0 0 50 
[9,] 0 0 50 
[10,] 0 0 50 
[11,] 0 0 100 
[12,] 0 0 100 
[13,] 0 0 100 
[14,] 0 0 100 
[15,] 0 0 100 
[16,] 0 0 150 
[17,] 0 0 150 
[18,] 0 0 150 
[19,] 0 0 150 
[20,] 0 0 150 
+0

謝謝你的回答。這與我所需要的非常接近,除了我希望'mat'具有5行相同的值(w [i,])並且爲每次運行'd'重新創建。請看我編輯的例子 – Mengll

+0

那麼,我的答案中的「mat」重複了5次? – harkmug

+0

5'墊每個包含同一行的重複。所以基本上你的'墊'切成4個較小的矩陣。 – Mengll