2013-07-04 4 views
2

У меня есть два матрица, один из которых двоичный (нулевой или один), а другой - целочисленная матрица одинаковых размеров, это квадратные матрицы.R Комбинированные матрицы

Я хотел бы эффективный способ их комбинирования определенным образом, без итераций по каждому элементу.

Способ, которым я хотел бы объединить их, состоит в том, чтобы иметь результирующую матрицу из матрицы A и матрицы B, что для элемента принимает самое низкое число, которое не равно нулю.

Может ли кто-нибудь подумать об трюке в R, чтобы достичь этого, я пытался сделать это математически, но продолжаю сокращаться, мне было интересно, существует ли способ наложения матриц условным выражением?

+1

Что произойдет, если А и В равно 0? – mnel

+1

Я думаю, что вы должны нам пример с ожидаемым выходом. – flodel

+1

@flodel Решение Dwin было тем, к чему я стремился. Экземпляр 0,0, рассматриваемый в matC [1,3] в указанном решении, был бы ошибочным результатом, но не должен возникать в теории. Я хотел бы привести вам более подробный пример, но, поскольку я затормозил теорию, лежащую на ней на этой неделе, для этого процесса недостаточно для этого. Я был бы счастлив следить через неделю или около того. В широком смысле это будет что-то, что используется для построения сети взаимодействия генов. –

ответ

2
matA <- matrix(-8:7, 4,4); set.seed(123) 
matB <- matrix(sample(0:1, 16, repl=TRUE), 4, 4) 
matC <- matrix(NA, nrow(matA), ncol(matA)) 
matC[] <- pmin(matA, MatB) 
matC[ matB==0] <- matA[matB==0] 

matB 
#----------- 
    [,1] [,2] [,3] [,4] 
[1,] 0 1 1 1 
[2,] 1 0 0 1 
[3,] 0 1 1 0 
[4,] 1 1 0 1 
matC 
#--------- 
    [,1] [,2] [,3] [,4] 
[1,] -8 -4 0 1 
[2,] -7 -3 1 1 
[3,] -6 -2 1 6 
[4,] -5 -1 3 1 
(и, возможно, приведите пример.)

Метод флоеды производит:

0 Метод

mnel производит:

> (matB * !matA) + matA 
    [,1] [,2] [,3] [,4] 
[1,] -8 -4 1 4 
[2,] -7 -3 1 5 
[3,] -6 -2 2 6 
[4,] -5 -1 3 7 
+0

Спасибо за ваше решение, но, к сожалению, в то время как это было именно то, что я собирался делать на своих меньших наборах данных, когда я масштабировал его до моих больших наборов данных, я долго Vector error :( –

+0

Интересно, что '0' в' matC [1, 3] '. – flodel

+0

И matA, и matB были' 0', поэтому на самом деле нет другого варианта. –

2

Моя догадка:

ifelse(A == 0, B, pmin(A, B)) 

или, может быть,

ifelse(A == 0, B, ifelse(B == 0, A, pmin(A, B))) 

Если это не то, что вы ищете, пожалуйста, уточнить

1

С @ A_Skeleton Прокомментируема масштабирования, можно разбить матрицу на куски:

mnel <- function(matA, matB) { 
    (matB * !matA) + matA 
} 

# method takes a function as the argument 
mcombine <- function(matA, matB, method) { 
    chunkSize <- 10000 
    matC <- matrix(0, nrow(matA), ncol(matA)) 
    for (i in 1:floor(nrow(matA)/chunkSize)) { 
    curRange <- (chunkSize * (i-1) + 1):(i * chunkSize) 
    matC[curRange,] <- method(matA[curRange,], matB[curRange,]) 
    } 
    # handle case where dimensions don't divide exactly into chunks 
    lastRange <- i*chunkSize:nrow(matA) 
    matC[lastRange,] <- method(matA[lastRange,], matB[lastRange,]) 
    matC 
} 

# Using mnel's method: 
matC <- mcombine(matA, matB, mnel) 
Смежные вопросы