r - 替换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
解决方案
简单一点,你可以这样做
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)
推荐阅读
- sql - 更改某些列的默认权限
- android - 如何禁用 RecyclerView 单击侦听器但滚动工作
- vba - 我需要帮助循环使用 Excel VBA 的 if 语句中的索引/匹配
- swift - 如何在swift中集成TPKeyboardavoiding?
- visual-studio-2017 - 如何配置 Visual Studio 2017 在发布时不生成 nuget 包作为输出
- ios - 在项目结构中找不到来自故事板的自定义视图控制器
- javascript - 如何使用 Google Calendar API v3 (JavaScript) 移除事件通知
- python - 为 2D numpy 数组形成协方差矩阵
- android - Kivy App 立即在 android 上崩溃,陷入循环
- php - 如何在php中获取空索引foreach循环