我正在编写一些代码来执行一些博弈论模拟。 我的“世界”有几个州(在我的情况下说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是2x2矩阵。但是,我认为在列表上执行操作会变得很慢,并且矢量化将很难。
是否有关于正确实施的建议或对上述代码无效的解释?
更新:显然正确的语法是:
U[1,1, , ] = cbind(c(0.7,0.3),c(0.3,0.7))
我的问题仍然存在 - 哪个更好,多维向量或元组列表?
谢谢,
答案 0 :(得分:11)
此代码无法正常工作,您至少应该亲自尝试:
array(2,2,2,2) ## results in unused argument error
我想你想要一个4D阵列
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]
这将给出一个4D阵列,但有一个有两个“退化”维度,即[1,1,2,2],其中前两个是多余的(但这种意义实际上取决于你的目的)。这部分与为原始数组的子集分配新值的问题并不真正相关,但它可能有助于您理解。
阵列或列表是否最适合您取决于您想要做什么,所以我建议重新询问您的问题并关注这些需求。