Создайте матрицу из 1 и нулей, чтобы замаскировать линии Рэлея-Тиндаля в R - PullRequest
3 голосов
/ 28 февраля 2012

Я делаю флуоресцентную спектроскопию и затем обрабатываю файлы с помощью R. Я хотел бы создать матрицу из 1 и 0 так, чтобы я мог замаскировать линии Рэлея-Тиндаля из матриц возбуждения-эмиссии (EEM).EEMs ​​имеют 44 столбца (возбуждения) и 602 ряда (выбросы).Длины волн возбуждения варьируются от 240 до 455 нм с шагом 5 нм.Длина волны излучения составляет от 300 до 600,5 с шагом 0,5 нм.Результирующая матрица для маскировки должна выглядеть примерно так (это всего лишь небольшой вырез матрицы из матрицы. Фактическая матрица имеет размер 44 * 602):

    240 245 250 ... 300 305 310 ... 455
300   1   1   1 ...   0   1   1 ...   1
300.5 1   1   1 ...   1   1   1 ...   1
...
305   1   1   1 ...   1   0   1 ...   1
...
310   1   1   1 ...   1   1   0 ...   1
...
480   0   1   1 ... 
...  
600   1   1   1 ...   0   1   1 ...
600.5 ...

Когда матрица маскируется(желаемый) создан, я хочу умножить его на фактические значения EEM.Примерно так должно получиться:

corrected_EEM_Intensity <- Mask.Matrix * Sample_EEM

EEMs выглядят так (44 столбца * 602 строки по размеру):

        240  245 ... 455
300   202.7  ...
300.5 190.5  ... 
...   ....   ...
600    82.4  ...
600.5  45.9  ...

Так что я хотел бы разделить возбуждениячерез выбросы и наоборот.Если эмиссия является фактором возбуждения и наоборот, в матрице должен быть 0.В других случаях должно быть 1.

Чтобы сделать вещи более сложными, я хотел бы сделать это не только для соответствующих факторов, но и в диапазоне 10 нм.Это означает, что, например, возбуждение 430, разделенное на излучение 440, и возбуждение, разделенное на 450, также должны дать 0.

Матрица реального маскирования должна выглядеть примерно так (в качестве краткого примера):

    240  ... 400 ... 455
300   1
300.5 1  ...   1 ...   1
...   1    1   1   1   1
...
390   1    1   0   1   1
...   1    1   0   1   1
400   1    1   0   1   1
...
600
600.5 1    1   1   1   1

Как я могу это сделать?

Я надеюсь, что теперь я более четко понимаю эту проблему.

После долгих исследований и некоторых собственных испытаний я не смог найтиответ на это.Любая прямая помощь или ссылки на другие веб-сайты / сообщения приветствуются.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Если вы хотите протестировать пары, где a - это коэффициент b , или наоборот, вы можете использовать следующее (РЕДАКТИРОВАТЬ: теперь считается, что по модулю <=10 как ноль, т. Е. Если <em>a находится в пределах 10 с коэффициентом b , соответствующая ячейка матрицы устанавливается в ноль):

cols <- seq(240, 455, 5)
rows <- seq(300, 600.5, 0.5)
# Create a two-column matrix containing all possible excitation-emission pairs.  
d <- expand.grid(rows, cols, stringsAsFactors=FALSE)

# For each pair, test whether the smaller is a factor of the larger
# Set the number on the right hand side of the comparison (<=) to the 
#  maximum distance (from a true factor) within which numbers will be
#  considered factors.
test <- apply(d, 1, function(x) max(x) %% min(x) <= 10)

# Create a matrix and populate with the (inverse) outcome of the test
res <- matrix(as.numeric(!test), ncol=44, nrow=602,
              dimnames=list(rows, cols))

# Partial output
res[c('300', '300.5', '305', '310', '430', '480'), 
    c('240', '245', '250', '300', '305', '310', '440', '455')]
#      240 245 250 300 305 310 440 455
#300     1   1   1   0   0   0   1   1
#300.5   1   1   1   0   0   0   1   1
#305     1   1   1   0   0   0   1   1
#310     1   1   1   0   0   0   1   1
#430     1   1   1   1   1   1   0   1
#480     0   1   1   1   1   1   1   1
0 голосов
/ 29 февраля 2012

Вот решение с использованием outer().

excitations <- seq(from = 240, to = 455,   by = 5)
emissions   <- seq(from = 300, to = 600.5, by = 0.5)

names(excitations) <- as.character(excitations)
names(emissions)   <- as.character(emissions)

tol <- 10
mask.fun <- function(x, y) as.numeric(x %% y > tol     &
                                      x %% y < y - tol &
                                      y %% x > tol     &
                                      y %% x < x - tol)

mask.mat <- outer(X = emissions, Y = excitations, FUN = mask.fun)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...