2011-06-22 59 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]其中前两个是种多余的(但这种感觉真的取决于你的目的)。这部分与为原始数组的子集分配新值的问题并不相关,但它可能有助于理解。

无论数组还是列表最适合您,取决于您想要做什么,因此我建议您重新提出您的问题并关注这些需求。