Заменить внутренность многомерной матрицы / тензора в R - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть матрица 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 на 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

Ответы [ 3 ]

2 голосов
/ 10 ноября 2019

Это немного проще, вы можете сделать это так:

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 голос
/ 10 ноября 2019

Вы можете попробовать использовать матрицу селектора для подмножества региона и заменить его с помощью матрицы 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 голосов
/ 10 ноября 2019

Несколько более общим ответом на запрос будет использование логического выражения внутри оператора "[", используемого с оператором присваивания "<-": </p>

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

В действительности в игре только одна функцияи его имя "[<-", и он принимает три аргумента. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...