创建一个由1和0组成的矩阵,以屏蔽R中的瑞利-廷德尔线
我正在做荧光光谱学,然后用R处理文件。我想创建一个1和0的矩阵,这样我可以从激发-发射矩阵(EEM)中屏蔽瑞利-廷德尔线。 EEM有44列(激发)和602行(发射)。激发波长范围为240至455nm,步长为5nm。发射波长范围为300至600.5,步长为0.5 nm。生成的要屏蔽的矩阵应该如下所示(这只是屏蔽矩阵的一个小切口。实际矩阵的大小为44*602): 创建遮罩矩阵(所需矩阵)时,我想将其与实际EEM值相乘。像这样的事情应该会起作用:创建一个由1和0组成的矩阵,以屏蔽R中的瑞利-廷德尔线,r,matrix,R,Matrix,我正在做荧光光谱学,然后用R处理文件。我想创建一个1和0的矩阵,这样我可以从激发-发射矩阵(EEM)中屏蔽瑞利-廷德尔线。 EEM有44列(激发)和602行(发射)。激发波长范围为240至455nm,步长为5nm。发射波长范围为300至600.5,步长为0.5 nm。生成的要屏蔽的矩阵应该如下所示(这只是屏蔽矩阵的一个小切口。实际矩阵的大小为44*602): 创建遮罩矩阵(所需矩阵)时,我想将其与实际EEM值相乘。像这样的事情应该会起作用: corrected_EEM_Intensity <
corrected_EEM_Intensity <- Mask.Matrix * Sample_EEM
所以我想把激发除以发射,反之亦然。如果发射是激发子的一个因子,反之亦然,则矩阵中应为0。在其他情况下,应为1
为了使事情更复杂,我想做的不仅仅是相应的因素,而是在10纳米的范围内。这意味着,例如,激励430除以发射440,激励除以450也应得到0
然后,真正的遮罩矩阵应如下所示(作为简短示例):
我该怎么做
我希望我现在对这个问题更加清楚
经过大量的研究和自己的一些试验,我找不到这个问题的答案。
非常感谢您对其他网站/帖子的任何直接帮助或链接。如果您想测试a是b的一个因子的配对,或者反之亦然,您可以使用以下方法(编辑:现在考虑模,这里是使用
outer()的解决方案。
激发提供一些示例数据(例如EEM矩阵)和示例计算将有助于回答您的问题。您说:“如果激发波长(单位为nm)或其倍数等于发射波长(也以nm为单位)或其倍数,则矩阵中应为零。”。如果我有两个数字a
和b
,那么a*b
就是这两个数字的倍数。因此,如果我按照你的定义,你的矩阵应该到处都是零。请重新表述。正如@flodel所说,任何一对数字都有一个最小公倍数。如果你打算测试的是一对,其中一个元素是另一个元素的因子,请看下面我的解决方案。我很抱歉对我的问题的描述很糟糕和混乱。我正在重新编写问题以改进它。请再次查看问题。对解决我的问题的任何帮助仍然非常感谢。谢谢@Strohmi,现在更清楚了。干杯。这是我想要的。现在,问题被扩展了这样,我不仅希望相应的因子为0,而且还希望在10或20 nm的范围内。这意味着,例如,激发440除以发射430也应该为零。我希望我清楚地说明我需要什么。
corrected_EEM_Intensity <- Mask.Matrix * Sample_EEM
240 245 ... 455
300 202.7 ...
300.5 190.5 ...
... .... ...
600 82.4 ...
600.5 45.9 ...
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
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
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)