列表中有数十万个矩阵,应按组标识符进行汇总。例如,有两个具有不同尺寸的矩阵。
a <- matrix(c(1:12),nrow=3,ncol=4,dimnames=list(c(0:2),c(0:3)))
b <- matrix(c(1:6),nrow=2,ncol=3,dimnames=list(c(0:1),c(0:2)))
> a
0 1 2 3
0 1 4 7 10
1 2 5 8 11
2 3 6 9 12
> b
0 1 2
0 1 3 5
1 2 4 6
您知道如何汇总这些矩阵以简单的方式获得以下矩阵吗?
c <- a + b
> c
0 1 2 3
0 2 7 12 10
1 4 9 14 11
2 3 6 9 12
这可能不是一个难题,但是我找不到解决方案。
行和列的名称从0开始,依次递增1,但最大数量根据每个元素而有所不同。较小矩阵中无与伦比的尺寸可以用0填充。
我想我可以按组汇总它们,但是不能汇总具有不同尺寸的矩阵。
答案 0 :(得分:1)
这是一个函数,它吸收两个矩阵并将它们填充为0,以使它们的尺寸相同。然后将它们相加。可以与config.py
一起使用,以在一个操作中将多个数字相加。
首先,获取两个矩阵的最大行数和最大列数。然后,使用这些最大尺寸创建一个0矩阵。然后,仅填充与每个输入匹配的子矩阵。矩阵求和并返回。
getConfig
答案 1 :(得分:1)
以下是一些替代解决方案:
1)将每个转换为长格式,得到both
,然后使用tapply
进行汇总并转换回宽格式:
both <- rbind(as.data.frame.table(a), as.data.frame.table(b))
tapply(both[[3]], both[-3], sum, default = 0)
给予:
Var2
Var1 0 1 2 3
0 2 7 12 10
1 4 9 14 11
2 3 6 9 12
2)这将创建具有结果形状的矩阵zero
,然后定义一个函数upleft
,该函数将其第一个参数插入零的左上角。最后,我们将它们加在一起。
upleft <- function(x, zero) replace(zero, cbind(c(row(x)), c(col(x))), x)
zero <- array(0, pmax(dim(a), dim(b)))
upleft(a, zero) + upleft(b, zero)
给予:
[,1] [,2] [,3] [,4]
[1,] 2 7 12 10
[2,] 4 9 14 11
[3,] 3 6 9 12
答案 2 :(得分:1)
您可以使用该函数获取任意两个矩阵,调整行和列的数量,将它们填充为0,然后将它们加起来。
sum_mat = function(a, b){
temp = matrix(data = 0, nrow = max(nrow(a), nrow(b)), ncol = max(ncol(a), ncol(b)))
temp_a = temp
temp_a[1:nrow(a), 1:ncol(a)] = a
temp_b = temp
temp_b[1:nrow(b), 1:ncol(b)] = b
temp_a + temp_b
}
> a
0 1 2 3
0 1 4 7 10
1 2 5 8 11
2 3 6 9 12
> b
0 1 2
0 1 3 5
1 2 4 6
c = sum_mat(a, b)
> c
0 1 2 3
0 2 7 12 10
1 4 9 14 11
2 3 6 9 12