通过与列对应的块的最大值对块间进行归一化

Normalize between-blocks by the maxima of the block corresponding to the columns

这个问题是我 的后续问题 我不想通过局部最大值对块进行归一化,而是通过对应于列的块的最大值对块间进行归一化。

#dummy data
mat <- matrix(round(runif(90, 0, 50),),9,9)
rownames(mat) <- rep(LETTERS[1:3],3)
colnames(mat) <- rep(LETTERS[1:3],3)

#Normalizes within and between blocks by the maxima of the focal block
ans <- mat / ave(mat, rownames(mat)[row(mat)], colnames(mat)[col(mat)], FUN = max)

#Number of blocks
sum(ans == 1)
#[1] 9

我想标准化块间,即ABACBABCCACB 通过与列对应的块的最大值。例如,在 AB 的情况下,通过 BB 中的 max() 对其进行归一化,而 AC 通过 CC 中的 max()

> mat[rownames(mat)=="A",colnames(mat)=="B"]
  B  B  B
A 26 26 14
A 12 11 18
A 44 44 29

> mat[rownames(mat)=="B",colnames(mat)=="B"]
  B  B  B
B  9 23 20
B 28 45 28
B 14 12 45

在这种情况下,标准化块间 AB 不是通过该块的最大值(即 44),而是通过块 BB 的最大值(即 45)。

非常感谢任何指点!

cn 是通过首先用其列名替换mat 的每个元素然后逐列展开生成的矩阵而形成的向量。类似地对给出 rn 的行执行相同的操作。

(cn == rn) * matmat 相同,除了所有非对角线块都被清零。

v 是一个向量,其名称是唯一的列名称,其值是相应对角线块的最大值。 v 的构造取决于最大值为 0 或更大的事实。

replace(mat, TRUE, v[cn]) 是将 mat 的每个元素替换为其列中对角线块的最大值而形成的矩阵,最后我们将 mat 除以该矩阵。

请注意,如果任何对角线块全为零,则该列将全为 NaN;但是,如果任何非对角线块都为零,应该没有任何问题。

cn <- colnames(mat)[col(mat)]
rn <- rownames(mat)[row(mat)]
v <- tapply((cn == rn) * mat,  cn, max)
mat / replace(mat, TRUE, v[cn])