2012-10-17 49 views
1

這個問題可能聽起來與其他問題類似,但是當我檢查它們時,它們與我所尋找的有所不同。這裏是我的代碼如下,在R中取循環的總和

Data <- rbind(c(54, 55, 51), c(52, 51, 57)) 
WMatrix <- rbind(c(0, 1), c(1, 0)) 

for(i in 1:2){ 
    for(j in 1:2){ 
     for(t in 1:2){ 
     print(WMatrix[i,j]*Data[j,t]*Data[i,t+1]) 
     } 
    } 
} 

這個代碼的輸出是,

[1] 0 
[1] 0 
[1] 2860 
[1] 2601 
[1] 2754 
[1] 3135 
[1] 0 
[1] 0 

現在,我想有從環立刻產生這個輸出的總和(不上市的話)。也就是說,循環的輸出應該是11350,這是循環中所有生成的輸出的總和。我知道這個問題可能很簡單,但我仍然在學習基本編程。我試過這個,

for(i in 1:2){ 
    for(j in 1:2){ 
     for(t in 1:2){ 
     print(sum(WMatrix[i,j]*Data[j,t]*Data[i,t+1])) 
     } 
    } 
} 

但是,輸出仍然是一樣的,有人可以幫助我嗎?

謝謝:)

+0

爲什麼你不用言語表達你想表達的內容?如果我們不知道你的目標是什麼,這很難提供幫助。 –

+0

Ahm,對不起,先生,但我決定在這裏舉一個例子,這對我來說很容易看問題。我唯一的目標是立即從我製作的循環中獲得那些(2860,2601,...等)的總和。也就是說,我想要所有輸出的總和,而不是像上面那樣有一個列表。 –

+0

我想從我的循環產生的輸出是11350,這只是2860,2601,...等的總和 –

回答

8

矩陣代數的一點點,你在一個步驟中完成:

sum(WMatrix * (Data[, -3] %*% Data[, -1])) 
[1] 11350 

編輯:在R上的*運營商執行的elementwise乘法,而%*%給矩陣產品。

+1

這就是精神。 –

+0

哇,我沒有意願通過指數去嘗試猜測他想做什麼。 – January

+2

@Andrie,你可以向後描述操作符(順便說一下'*'執行的元素乘法有時被稱爲* Hadamard產品* http://en.wikipedia.org/wiki/Hadamard_product_%28matrices%29) –

3

這裏,這完全是低效的,倒像是C代碼等,但打印你想要什麼,我猜。我不會在不知道您實際嘗試實現的內容的情況下優化代碼,這些操作是什麼。

編輯:看到更高級的替代答案。 @Andrie居然猜到你想要要做。

sum <- 0 
for(i in 1:2){ 
    for(j in 1:2){ 
    for(t in 1:2){ 
     sum <- sum + WMatrix[i,j]*Data[j,t]*Data[i,t+1] 
    } 
    } 
} 
print(sum) 
+0

非常感謝...這就是我要找的...! –