2011-06-22 122 views
7

我正在編寫一些代碼來執行一些遊戲理論模擬。 我的「世界」有幾個州(在我的例子中說2),它也有幾個玩家(同樣是2),每個玩家都有一個支付矩陣(2乘2)。多維數組與列表元組的列表

我試圖創建R中的以下多維數組:

U = array(2,2,2,2) 
U[1][1] = cbind(c(0.7,0.3),c(0.3,0.7)) 

和我收到以下錯誤:

number of items to replace is not a multiple of replacement length 

我可以移動到使用列表,其中,每個項目將是兩個項目的列表,A和B,其中A和B是2×2矩陣。不過,我認爲在列表上執行操作會慢慢變得煩人,並且向量化將很難。

有沒有關於上述代碼無效的正確實施或解釋的建議?

更新:顯然,正確的語法是:

U[1,1, , ] = cbind(c(0.7,0.3),c(0.3,0.7)) 

我的問題仍然有效 - 這是更好的,多維向量或元組的列表?

感謝,

  • 羅恩

回答

10

此代碼不能工作,你至少應該嘗試一下自己:

array(2,2,2,2) ## results in unused argument error 

我想你想一個四維陣列

U <- array(0, dim = c(2,2,2,2)) 

然後分配到2D部使用的r?提取語法

U[1,1,,] <- cbind(c(0.7,0.3),c(0.3,0.7)) 

代碼U[1][1]可以是U形的術語理解爲如果是不帶「暗淡」屬性(只是在一個數字的向量被治療矢量,沒有維度結構)。第一個[1]提取第一個元素,返回單個元素矢量,第二個[1]反過來從該單個元素矢量中冗餘提取第一個元素。

就理解U[1,1,,]是什麼而言:這是2D矩陣,它是4D陣列U的一個子集,通過從第一維和第二維獲取第一個切片以及從第三個維和第四維獲取每個切片。

您看到的錯誤來自您試圖將一個2D矩陣分配到U的單個元素的事實 - 但只有一個插槽,並且第一個元素的結構和大小與您嘗試的矩陣不同去粉碎它。

從結果中刪除(默認情況下)從提取的子集中只有一個切片的單身維(第一個和第二個維)。這可以通過指定來避免:

U[1, 1, , , drop = FALSE] 

這將使一個四維陣列,但是一個具有兩個「簡併」尺寸,即[1,1,2,2]其中前兩個是種多餘的(但這種感覺真的取決於你的目的)。這部分與爲原始數組的子集分配新值的問題並不相關,但它可能有助於理解。

無論數組還是列表最適合您,取決於您想要做什麼,因此我建議您重新提出您的問題並關注這些需求。