我有一个由两个矩阵和一个向量组成的大型数据集。两个矩阵之一和向量具有变化的元素。我想遍历所有可能的向量矩阵组合,为每次迭代添加每一列和每一行,最后将这些结果存储在向量中。
向量的一个元素为“ 1”,其余为0。矩阵的对角线上到处都是1,除了一个较小的0块之外。
向量和矩阵不是彼此独立的,矩阵0的位置取决于向量中1的位置。
例如,矩阵的元素按大小2 * 2分组,然后,当向量的第一个或第二个元素为1时,矩阵在对角线上的第一个2 * 2块中为0。如果1位于向量的第三个元素中,则矩阵中0的块将移至[3:4,3:4],依此类推。
我举一个带有矩阵a
和b
以及向量c
的小例子:
a <- matrix(1:36, nrow = 6, byrow = TRUE)
在此示例中,我将元素沿着大小为3 * 3的块分组在一起。由于我不知道如何很好地循环,因此我已经为b
和c
准备了所有组合:
b <- matrix(rep(1, times = 36), nrow = 6, byrow = TRUE)
b1 <- b
b1[1:3,1:3] <- 0
b2 <- b
b2[4:6,4:6] <- 0
c1 <- rep(0, times = 6)
c1[1] <- 1
c2 <- rep(0, times = 6)
c2[2] <- 1
c3 <- rep(0, times = 6)
c3[3] <- 1
c4 <- rep(0, times = 6)
c4[4] <- 1
c5 <- rep(0, times = 6)
c5[5] <- 1
c6 <- rep(0, times = 6)
c6[6] <- 1
d1 <- sum(colSums(b1 * diag(as.vector(a %*% c1), nrow = 6)))
d2 <- sum(colSums(b1 * diag(as.vector(a %*% c2), nrow = 6)))
d3 <- sum(colSums(b1 * diag(as.vector(a %*% c3), nrow = 6)))
d4 <- sum(colSums(b2 * diag(as.vector(a %*% c4), nrow = 6)))
d5 <- sum(colSums(b2 * diag(as.vector(a %*% c5), nrow = 6)))
d6 <- sum(colSums(b2 * diag(as.vector(a %*% c6), nrow = 6)))
两个矩阵之间的相乘是元素的乘积。
我将结果存储在results
results <- cbind(d1, d2, d3, d4, d5, d6)
给出:
d1 d2 d3 d4 d5 d6
[1,] 75 78 81 30 33 36
有没有一种方法可以使用循环有效地做到这一点?如果能够在代码内部定义块的大小,我也将非常感激。在我的数据中,这些块大约为50 * 50。另外,我的数据集中有几个块。
答案 0 :(得分:1)
a <- matrix(1:36, nrow = 6, byrow = TRUE)
b <- matrix(rep(1, times = 36), nrow = 6, byrow = TRUE)
b1 <- b
b1[1:3,1:3] <- 0
b2 <- b
b2[4:6,4:6] <- 0
我的循环代码...
for (i in seq(6)){
temp = rep(0, 6)
temp[i] = 1
assign(paste('c', i, sep = ''), temp)
}
for (i in seq(6)){
cx = get(paste('c', i, sep = ''))
if(i<4){
px = sum(colSums(b1 * diag(as.vector(a %*% cx), nrow = 6)))
assign(paste('d', i, sep = ''), px)
} else{
px = sum(colSums(b2 * diag(as.vector(a %*% cx), nrow = 6)))
assign(paste('d', i, sep = ''), px)
}
}
然后结果
results <- cbind(d1, d2, d3, d4, d5, d6)