例如,我有一个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
稍微简单一点,您可以这样做
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)
[您可以尝试使用选择器矩阵对区域进行子集化,并使用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
这种替换方法的优点是要子集的值,并且替换可以在矩阵中的任何位置,但是缺点可能是手动构造和存储选择器矩阵。
对请求的更一般的答复是在与赋值运算符“ 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
实际上只有一个函数在起作用,它的名称是“ [