Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
矩阵列表上的R冒号算子_R_List_Collections_Matrix_Indexing - Fatal编程技术网

矩阵列表上的R冒号算子

矩阵列表上的R冒号算子,r,list,collections,matrix,indexing,R,List,Collections,Matrix,Indexing,我在R中创建了一个矩阵列表。在列表中的所有矩阵中,我想“拉出”特定索引的矩阵元素集合。我在想冒号操作符可能允许我在一行中实现这一点。例如,这里尝试访问列表中所有矩阵的[1,1]元素: myList = list() #list of matrices myList[[1]] = matrix(1:9, nrow=3, ncol=3, byrow=TRUE) #arbitrary data myList[[2]] = matrix(2:10, nrow=3, ncol=3, byrow=TRUE)

我在R中创建了一个矩阵列表。在列表中的所有矩阵中,我想“拉出”特定索引的矩阵元素集合。我在想冒号操作符可能允许我在一行中实现这一点。例如,这里尝试访问列表中所有矩阵的[1,1]元素:

myList = list() #list of matrices
myList[[1]] = matrix(1:9, nrow=3, ncol=3, byrow=TRUE) #arbitrary data
myList[[2]] = matrix(2:10, nrow=3, ncol=3, byrow=TRUE)

#I expected the following line to output myList[[1]][1,1], myList[[2]][1,1]
slice = myList[[1:2]][1,1] #prints error: "incorrect number of dimensions"
上述代码的最后一行抛出错误“维数不正确”

作为参考,这里有一个我正在尝试做的工作(但不那么优雅)实现:

#assume myList has already been created (see the code snippet above)
slice = c()
for(x in 1:2) {
    slice = c(slice, myList[[x]][1,1])
}
#this works. slice = [1 2]
有人知道如何在一条生产线上进行上述操作吗

请注意,我的“矩阵列表”可以替换为其他内容。如果有人能建议一种替代的“矩阵集合”数据结构,允许我执行上述操作,那么这将得到解决


也许这个问题很傻……不过我真的希望有一个干净的单行实现

两件事。首先是
[
[[
之间的区别。
中的相关句子?'['

[,[]和$之间最重要的区别是,[可以 选择多个元素,而其他两个选择单个元素 元素


因此,您可能需要执行
myList[1:2]
。其次,您不能按照描述的方式组合子集操作。一旦执行
myList[1:2]
,您将得到一个包含两个矩阵的列表。一个列表通常只有一个维度,因此在您的情况下执行
myList[1:2][1,1]
是毫无意义的(请参阅注释了解例外情况)

您可以尝试使用
lappy
来代替:
lappy(myList,[',1,1)

这可以:

> sapply(myList,"[",1,1)
[1] 1 2

编辑:哦,对不起,我在前面的答案末尾看到了几乎相同的想法。但是sapply可能更接近你想要的,无论如何

如果你的矩阵都有相同的维数,你可以将它们存储在三维数组中。这肯定会使索引和提取元素更容易

## One way to get your data into an array
a <- array(c(myList[[1]], myList[[2]]), dim=c(3,3,2))

## Extract the slice containing the upper left element of each matrix
a[1,1,]
# [1] 1 2
##将数据放入数组的一种方法

a与问题完全无关,但作为对“列表只有一个维度”的回应:您可以使用
dim()
为列表提供更多维度。例如
foo
myList[1:2][1,1]
仍然毫无意义,尽管
myList[1:2]
将返回只有一个维度的列表:)