我有一个简单的问题,但无法找到一个好的解决方案。所以希望,有人可以提供帮助:)
我想将矩阵B的每一列添加到矩阵A的列中,其中索引向量指定应该将此列的A列添加到该列。因此,有可能在A的同一列中添加了多个B列。我想积累这些更改而不是替换它们。
这是一个带有for循环的工作解决方案:
A <- matrix(0, ncol = 4, nrow = 4)
B <- matrix(c(1, 0, 0, 0, 2, 0, 1, 2, 0, 1, 1, 0), ncol = 3)
cols <- c(1, 2, 2)
for (i in seq_len(ncol(B))) {
A[, cols[i]] <- A[, cols[i]] + B[, i]
}
print(A)
我以为我可以在没有使用
的for循环的情况下编写它A <- matrix(0, ncol = 4, nrow = 4)
B <- matrix(c(1, 0, 0, 0, 2, 0, 1, 2, 0, 1, 1, 0), ncol = 3)
cols <- c(1, 2, 2)
A[, cols] <- A[, cols] + B
print(A)
但是这不会返回相同的矩阵,因为它将第二列B添加到A的第二列,但是在下一步中将其替换为B的第三列,而不是将两个替换添加到一起。
我正在寻找一种快速通用的解决方案,它也适用于不同的索引向量和矩阵。
答案 0 :(得分:0)
这并没有消除循环,但确实缩短了循环次数:
A <- matrix(0, ncol = 4, nrow = 4)
B <- matrix(c(1, 0, 0, 0, 2, 0, 1, 2, 0, 1, 1, 0), ncol = 3)
cols <- c(1, 2, 2)
for(i in unique(cols)){
A[, i] <- A[, i] + apply(as.matrix(B[, cols == i]), 1, sum)
}
print(A)
答案 1 :(得分:0)
试试这个
ans = A[,cols] + B
ans = sapply(split(1:NCOL(ans), cols), function(i) rowSums(ans[, i, drop = FALSE]))
inds = cbind(rep(1:NROW(A), length(unique(cols))), rep(unique(cols), each = NROW(A)))
replace(A, inds, ans[inds])
# [,1] [,2] [,3] [,4]
#[1,] 1 2 0 0
#[2,] 0 1 0 0
#[3,] 0 2 0 0
#[4,] 0 2 0 0