替换R中的多维矩阵/张量的内部

问题描述 投票:0回答:3

例如,我有一个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

如果y是一个3 x 3的矩阵,并且x是原始矩阵,则尝试这样做会出现错误:

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

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

是否有简单的方法来完成此操作?我必须产生一个索引向量吗?

此矩阵可能非常大,并且是大计算量的一部分,因此,我希望在任何解决方案中都节省尽可能多的内存/处理时间。

edit这些都是张量,实际上看起来像这样:

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

     [,1] [,2] [,3]
[1,]  900  900  900
[2,]  900  900  900
[3,]  900  900  900
r matrix
3个回答
2
投票

稍微简单一点,您可以这样做

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)

1
投票

[您可以尝试使用选择器矩阵对区域进行子集化,并使用y矩阵替换它,如下所示:

my_selector <- matrix(ncol = 2, byrow = TRUE, c(
  2, 2,
  2, 3,
  2, 4, 
  3,2,
  3,3,
  3,4,
  4,2,
  4,3,
  4,4
))
x[my_selector] <- y
# -------------------------------------------------------------------------
x
# [,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  

这种替换方法的优点是要子集的值,并且替换可以在矩阵中的任何位置,但是缺点可能是手动构造和存储选择器矩阵。


0
投票

对请求的更一般的答复是在与赋值运算符“ m[m>0] <- 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

实际上只有一个函数在起作用,它的名称是“ [

© www.soinside.com 2019 - 2024. All rights reserved.