【问题标题】:Manipulating sub matrices in R在 R 中操作子矩阵
【发布时间】:2018-10-23 19:10:42
【问题描述】:
Nh<-matrix(c(17,26,30,17,23, 17 ,24, 23), nrow=2, ncol=4); Nh
Sh<-matrix(c(8.290133, 6.241174, 6.096808, 7.4449672, 6.894924, 7.692115, 
             4.540521, 7.409122), nrow=2, ncol=4); Sh
NhSh<-as.matrix(Nh*Sh); NhSh
rh<-c( 0.70710678, 0.40824829, 0.28867513, 0.22360680, 0.18257419, 
       0.15430335, 0.13363062, 0.11785113, 0.10540926, 0.09534626); rh

pv <- c()
for (j in 1:2) {
  for (i in 1:4) {

    pv <- rbind(pv, NhSh[j,i]*rh)
  }
}
pv

row.names(pv) <- rep(c(1:2), each = 4)
lst<-lapply(split(seq_len(nrow(pv)), as.numeric(row.names(pv))), function(i) 
pv[i,])

data<-40
nlargest <- function(x, data) 
{
  res <- order(x)[seq_len(data)];
  pos <- arrayInd(res, dim(x), useNames = TRUE);
  list(values = pv[res], position = pos)
}
out <- lapply(lst, nlargest, data = 40)

继续上面的代码是否有任何简单的方法可以为 1:2 中的 k 的每个 out$'k'$position 重复以下步骤?

s1<-c(1,1,1,1); ch<-c(5,7,10,5); C<-150; a<-out$'1'$position 
for (j in a[40:1, "row"] ) 
{
 s1[j] <- s1[j]+1;
 cost1 <- sum(ch*s1);
 if (cost1>=C) break
}
s1; cost1
#Output [1] 5 6 6 5  

#       [1] 152

对于 out$k$position,我必须为 's' 和 'cost' 获得 2 个值。我试过了

mat = replicate (2,{x = matrix(data = rep(NA, 80), ncol = 2)}); mat
for (k in 1:2)
{
  mat[,,k]<-out$'k'$position
}
mat

错误 in mat[, , k]

for (k in 1:2)
{
for (j in mat[,,k][40:1] ) {
  s[j] <- s[j]+1  
  cost <- sum(ch*s)
  if (cost>=C) break

}
}
s; cost

错误 : s[j] 中的错误

请任何人帮助解决这些错误。

【问题讨论】:

  • 我猜倒数第二个代码是固定的,你希望最后一个代码块是固定的吗?
  • 我希望它分别返回 mat[,,1] 和 mat[,,2] 的 s 值和成本
  • 你在哪里定义了s?和s1一样吗?
  • 对不起,这是我的错误。它是 s1 定义为s1&lt;-c(1,1,1,1)
  • 另外,比较中的C是什么?

标签: r submatrix


【解决方案1】:

我们可以通过循环list 直接应用该函数。注意list的每个元素都是matrix

sapply(lst, is.matrix)
#  1    2 
#TRUE TRUE 

因此,无需unlist 并创建matrix

out <- lapply(lst, nlargest, data = 40)

-检查 OP 的结果

out1 <- nlargest(sub1, 40)
identical(out[[1]], out1)
#[1] TRUE

更新2

基于第二次更新,我们需要初始化 'cost' 和 'sl' 与 'k' 元素的长度相同。在这里,我们将 'sl' 初始化为 listvectors

sl <- rep(list(c(1, 1, 1, 1)), 2)
C <- 150
cost <- numeric(2)
for (k in 1:2){

for (j in mat[,,k][40:1, 1] ) {
    sl[[k]][j] <- sl[[k]][j]+1  
    cost[k] <- sum(ch*sl[[k]])
    if (cost[k] >=C) break


    }
   }   


sl
#[[1]]
#[1] 5 7 6 4

#[[2]]
#[1] 6 5 5 7

cost
#[1] 154 150

【讨论】:

  • 问题解决了。我真的很感谢你的帮助@akrun
  • @akrun- 抱歉,给您带来不便,但我需要询问在上述代码的继续中,是否有任何简短的方法可以为 k in 1 的每个 out$'k'$position 重复以下步骤: 100 ? s1&lt;-c(1,1,1,1); ch&lt;-c(5,7,10,5); a&lt;-out$1$position; for (j in a[40:1, "row"] ) { s1[j] &lt;- s1[j]+1; cost1 &lt;- sum(ch*s1); if (cost1&gt;=C) break } s1; cost1我必须为 out$k$position 获取 's' 和 'cost' 的 100 个值。
  • @Sam 你能更新你的问题吗?很难从 cmets 中读取
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2023-03-12
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多