多维数组与列表元组列表

Ron*_*Ron 8 r

我正在写一些代码来执行一些博弈论模拟.我的"世界"有几个状态(在我的情况下说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],其中前两个是多余的(但这种意义实际上取决于你的目的).这部分与为原始数组的子集分配新值的问题并不真正相关,但它可能有助于您理解.

阵列或列表是否最适合您取决于您​​想要做什么,所以我建议重新询问您的问题并关注这些需求.