创建一个由1和0组成的矩阵,以屏蔽R中的瑞利-廷德尔线

创建一个由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 <

我正在做荧光光谱学,然后用R处理文件。我想创建一个1和0的矩阵,这样我可以从激发-发射矩阵(EEM)中屏蔽瑞利-廷德尔线。 EEM有44列(激发)和602行(发射)。激发波长范围为240至455nm,步长为5nm。发射波长范围为300至600.5,步长为0.5 nm。生成的要屏蔽的矩阵应该如下所示(这只是屏蔽矩阵的一个小切口。实际矩阵的大小为44*602):

创建遮罩矩阵(所需矩阵)时,我想将其与实际EEM值相乘。像这样的事情应该会起作用:

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)