在矩阵上循环-向量乘法,每轮元素都改变

时间:2018-09-10 11:28:11

标签: r

我有一个由两个矩阵和一个向量组成的大型数据集。两个矩阵之一和向量具有变化的元素。我想遍历所有可能的向量矩阵组合,为每次迭代添加每一列和每一行,最后将这些结果存储在向量中。

向量的一个元素为“ 1”,其余为0。矩阵的对角线上到处都是1,除了一个较小的0块之外。

向量和矩阵不是彼此独立的,矩阵0的位置取决于向量中1的位置。

例如,矩阵的元素按大小2 * 2分组,然后,当向量的第一个或第二个元素为1时,矩阵在对角线上的第一个2 * 2块中为0。如果1位于向量的第三个元素中,则矩阵中0的块将移至[3:4,3:4],依此类推。

我举一个带有矩阵ab以及向量c的小例子:

a <- matrix(1:36, nrow = 6, byrow = TRUE)

在此示例中,我将元素沿着大小为3 * 3的块分组在一起。由于我不知道如何很好地循环,因此我已经为bc准备了所有组合:

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。另外,我的数据集中有几个块。

1 个答案:

答案 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)