Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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 - Fatal编程技术网

R 在矩阵-向量乘法上循环,每一轮的元素都会发生变化

R 在矩阵-向量乘法上循环,每一轮的元素都会发生变化,r,R,我有一个由两个矩阵和一个向量组成的大数据集。两个矩阵和向量中的一个具有变化的元素。我想循环所有可能的向量矩阵组合,为每次迭代添加每一列和每一行,最后将这些结果存储在一个向量中 该向量有一个元素为1,其余元素为0。矩阵的对角线上除了一个较小的0块外,其他地方都有1 向量和矩阵不是相互独立的,矩阵的0的位置取决于1在向量中的位置 例如,矩阵的元素按大小2*2分组,然后当向量在第一个或第二个元素中有1时,矩阵在沿对角线的第一个2*2块中有0。如果1位于向量的第三个元素中,则矩阵中的0块移动到[3:4,

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

该向量有一个元素为1,其余元素为0。矩阵的对角线上除了一个较小的0块外,其他地方都有1

向量和矩阵不是相互独立的,矩阵的0的位置取决于1在向量中的位置

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

我给出了一个矩阵a和b以及向量c的小例子:

两个矩阵之间的乘法是按元素进行的

我将结果存储在结果中

有没有一种方法可以使用循环有效地实现这一点?如果我能在代码内部定义块的大小,我也会非常感激。在我的数据中,块大约是50*50。另外,我的数据集中有几个块

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)

你好你能告诉我们你想用这些结构做什么吗?它们对什么过程有贡献?向量和矩阵中有这么多的零,乘积的结果可能有一个比矩阵向量乘积的一般公式更简单的公式。例如,如果v的条目j为1,其余为零,那么%*%v就是sumA[,j]。你可以利用这个来加速你的计算,我不太明白。谢谢你提供更多的信息!您是否考虑过将数据作为数据帧或数据块而不是矩阵来处理?这可能会使代码更容易阅读,以便其他帮助您工作的人(例如,在堆栈溢出方面)或将来接替您的人更容易理解您的代码。当数据被标记并以表格的形式呈现时,也可能有一种众所周知的解决方案,例如,一列表示国家名称,一列表示经济部门,然后根据需要进一步数字列Hi:。你能在回答中补充一些细节吗?比如你的答案是如何解决问题的?代码运行良好:只是一个问题,在我的数据中有许多代码块。例如,如果i>10 | i<20。。。在第一个如果下工作?谢谢!else if有助于找到几种情况
     d1 d2 d3 d4 d5 d6
[1,] 75 78 81 30 33 36
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)