r - 创建一个由 1 和零组成的矩阵以屏蔽 R 中的 Rayleigh-Tyndall 线

标签 r matrix

我正在做荧光光谱,然后用 R 处理文件。我想创建一个 1 和 0 的矩阵,这样我就可以从激发-发射矩阵 (EEM) 中屏蔽掉瑞利-廷德尔线。
EEM 有 44 列(激发)和 602 行(发射)。激发波长范围为 240 至 455 nm,步长为 5 nm。发射波长范围为 300 至 600.5,步长为 0.5 nm。得到的要屏蔽掉的矩阵应该是这样的(这只是屏蔽掉矩阵的一小部分。实际的矩阵大小为 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

EEM 看起来像这样(44 列 * 602 行大小):
        240  245 ... 455
300   202.7  ...
300.5 190.5  ... 
...   ....   ...
600    82.4  ...
600.5  45.9  ...

所以我想通过排放来划分激励,反之亦然。如果发射是激发的一个因素,反之亦然,矩阵中应该有一个 0。在其他情况下,应该是 1。

为了让事情变得更复杂,我想不仅针对相应的因素,而且在 10 nm 的范围内这样做。这意味着例如激发 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

我怎样才能做到这一点?

我希望我现在对这个问题更加清楚。

经过大量研究和一些自己的试验,我找不到答案。
非常感谢任何直接帮助或与其他网站/帖子的链接。

最佳答案

如果您要测试 a 是 b 的因子的对,反之亦然,您可以使用以下命令(编辑:现在将 <= 10 的模数视为零,即如果 a 在 10 的因子的 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

关于r - 创建一个由 1 和零组成的矩阵以屏蔽 R 中的 Rayleigh-Tyndall 线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9473365/

相关文章:

R - 并发编程

python - 最快的获取方式

python - Numpy 3d 数组矩阵乘法函数

c - 基本线性代数算法(MATLAB 和 C)

OpenGL - 将阴影立方体贴图投影到场景上

r - 使用 dplyr 对连续变量进行分类

R:如何在 data.frame 的行上使用 apply 并取出 $column_name?

java - 如何使用 Java 连接到 R(使用 Eclipse)

R 并行处理错误 `Error in checkForRemoteErrors(val) : 6 nodes produced errors; first error: subscript out of bounds`

c++ - SSE,行主要与列主要性能问题