我正在写一些代码来执行一些博弈论模拟.我的"世界"有几个状态(在我的情况下说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))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
number of items to replace is not a multiple of replacement length
Run Code Online (Sandbox Code Playgroud)
我可以转到使用列表,其中每个项目将是两个项目A和B的列表,其中A和B是2x2矩阵.但是,我认为在列表上执行操作会变得很慢,并且矢量化很难.
是否有关于正确实施的建议或对上述代码无效的原因的解释?
更新:显然正确的语法是:
U[1,1, , ] = cbind(c(0.7,0.3),c(0.3,0.7))
Run Code Online (Sandbox Code Playgroud)
我的问题仍然存在 - 哪个更好,多维向量或元组列表?
谢谢,
mds*_*ner 11
这段代码不可行,你至少应该自己尝试一下:
array(2,2,2,2) ## results in unused argument error
Run Code Online (Sandbox Code Playgroud)
我想你想要一个4D阵列
U <- array(0, dim = c(2,2,2,2))
Run Code Online (Sandbox Code Playgroud)
然后分配给2D部分使用R?提取语法
U[1,1,,] <- cbind(c(0.7,0.3),c(0.3,0.7))
Run Code Online (Sandbox Code Playgroud)
代码U[1][1]可以理解为U被视为没有"暗淡"属性的向量(只是向量中的数字,没有维度结构).第[1]一个元素提取第一个元素,返回单个元素向量,第二个元素[1]依次从该单个元素向量中冗余地提取第一个元素.
在理解什么U[1,1,,]是:这是2D矩阵,它是4D阵列的子集U,通过从第一和第二维度获取第一个切片,以及从第三和第四维度获取每个切片来指定.
您看到的错误来自于您尝试将2D矩阵分配到单个元素中的事实U- 但是只有一个槽,并且第一个元素的结构和大小与您尝试粉碎它的矩阵不同.
从结果中删除(默认情况下)从提取的子集中只有一个切片的单个维度(第一个和第二个).这可以通过指定:
U[1, 1, , , drop = FALSE]
Run Code Online (Sandbox Code Playgroud)
这将给出一个4D数组,但有一个有两个"退化"维度,即[1,1,2,2],其中前两个是多余的(但这种意义实际上取决于你的目的).这部分与为原始数组的子集分配新值的问题并不真正相关,但它可能有助于您理解.
阵列或列表是否最适合您取决于您想要做什么,所以我建议重新询问您的问题并关注这些需求.