首页 > 解决方案 > 替换R中多维矩阵/张量的内部

问题描述

我有一个 2x2 矩阵,例如:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    3    3    3    0
[3,]    0    3    3    3    0
[4,]    0    3    3    3    0
[5,]    0    0    0    0    0

我想用不同的矩阵替换这个矩阵的中间部分,即三分之二:

     [,1] [,2] [,3]
[1,]  900  900  900
[2,]  900  900  900
[3,]  900  900  900

所以我的输出看起来像这样:

     [,1]   [,2]    [,3]  [,4]   [,5]
[1,]    0    0      0      0      0
[2,]    0    900    900    900    0
[3,]    0    900    900    900    0
[4,]    0    900    900    900    0
[5,]    0    0      0      0      0

ify是一个 3 x 3 矩阵,并且x是原始矩阵,当我尝试这个时出现错误:

x[2:4, 2:4] = y

number of items to replace is not a multiple of replacement length

有没有简单的方法来实现这一点?我必须生成索引向量吗?

这个矩阵可能非常大,并且是大型计算的一部分,所以我想在任何解决方案中节省尽可能多的内存/处理时间。

编辑 这些都是张量,看起来像这样:

<A 3x3x1x1 dense tensor>
, , 1, 1

     [,1] [,2] [,3]
[1,]  900  900  900
[2,]  900  900  900
[3,]  900  900  900

标签: rmatrix

解决方案


简单一点,你可以这样做

m <- matrix(c(0,0,0,0,0,
              0,3,3,3,0,
              0,3,3,3,0,
              0,3,3,3,0,
              0,0,0,0,0), ncol = 5, byrow = TRUE)
m


m[2:4, 2:4] <- 900
m

     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0  900  900  900    0
[3,]    0  900  900  900    0
[4,]    0  900  900  900    0
[5,]    0    0    0    0    0

请注意,m[2:4, 2:4] <- rep(900,9)这也可以使用,其中rep(900,9)可以替换为任何向量(在这种情况下,长度为 9)。

所以另一种方式可能是

inner_matrix <- matrix(rep(900, 9),ncol=3, byrow=T)
m[2:4, 2:4] <- inner_matrix 

对于 >2 维的矩阵(在本例中为张量)

m <- array(structure(c(0, 0, 0, 0, 0, 
                       0, 3, 3, 3, 0, 
                       0, 3, 3, 3, 0, 
                       0, 3, 3, 3, 0, 
                       0, 0, 0, 0, 0), .Dim = c(5L, 5L, 1L, 1L)), dim=c(5,5,1,1))
m

m[2:4,2:4,1,1] <- rep(900,9)

推荐阅读