Как проверить, находится ли каждое значение в матрице между соответствующими значениями в двух других матрицах в R? - PullRequest
0 голосов
/ 13 мая 2018

У меня есть матрица, которую я хотел бы сравнить с двумя другими матрицами, чтобы увидеть, содержится ли каждая запись в моей матрице в пределах значений двух других матриц или вне значений. Например, если моя матрица:

> M
           [,1]       [,2]       [,3]
[1,] -0.1278982  0.4600544  1.3271033
[2,] -0.1079272  1.2196851 -0.5240536 
[3,]  0.9548449 -0.9979668 -0.6636296 

и две другие матрицы, которые у меня есть, это L и U:

> L 
            [,1]      [,2]       [,3]
[1,] -0.49416022 1.0992247 -1.2834469
[2,]  0.35491793 0.2460946  1.1411529
[3,]  0.01755317 0.2469062  0.2843848

и

> U
            [,1]       [,2]        [,3]
[1,] -0.84996737  1.0036554 -0.04747612
[2,]  0.35396050 -0.4612527 -1.47341334
[3,] -0.07716839 -1.5921625  1.62187501

Я хотел бы взять каждую запись M и сравнить, чтобы увидеть, содержится ли она в пределах диапазона, заданного соответствующей записью L и U.

Например, для M [1,1] он находится вне диапазона -0,49416022 и -0,84996737, и поэтому я назначу этому сравнению значение 0. С другой стороны, для M [2,3] значение равно -0,5240536 и находится в диапазоне от 1,1411529 до -1,47341334, поэтому при сравнении получается значение 0.

В конечном счете, я хотел бы получить матрицу всех 0 и 1, указывающую, содержались ли записи в M в соответствующих значениях в L и U. Например, если мы назовем эту матрицу M_comparisons, то:

> M_comparisons
            [,1]      [,2]       [,3]
[1,]           0         0          0
[2,]           0         0          1
[3,]           0         1          0

У кого-нибудь есть идеи, как я могу сделать это для больших матриц и возможно за очень быстрое время вычислений? Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Или другой способ

+(M > U & M < L)
0 голосов
/ 13 мая 2018

Так же просто, как:

(M > U & M < L)*1

#     [,1] [,2] [,3]
#[1,]    0    0    0
#[2,]    0    0    1
#[3,]    0    1    0

Или, как предложил Руи Баррадас (немного быстрее):

as.integer(M > U & M < L)

Benchmark

library(microbenchmark)

microbenchmark(
  (M > U & M < L)*1,
  as.integer(M > U & M < L)
)

#Unit: microseconds
#                      expr   min    lq    mean median     uq    max neval
#       (M > U & M < L) * 1 1.278 1.469 2.15965  1.640 1.8000 38.981   100
# as.integer(M > U & M < L) 1.042 1.212 1.59757  1.384 1.5375 12.008   100

Пример данных

M <- t(matrix(c(-0.1278982, 0.4600544, 1.3271033, 
                -0.1079272, 1.2196851, -0.5240536,
                 0.9548449, -0.9979668, -0.6636296), nrow = 3))
L <- t(matrix(c(-0.49416022, 1.0992247, -1.2834469, 
                 0.35491793, 0.2460946,  1.1411529, 
                 0.01755317, 0.2469062,  0.284384), nrow = 3))
U <- t(matrix(c(-0.84996737, 1.0036554, -0.04747612, 
                 0.35396050, -0.4612527, -1.47341334, 
                -0.07716839, -1.5921625, 1.6218750), nrow = 3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...