通过与列对应的块的最大值对块间进行归一化
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
我想标准化块间,即AB
、AC
、BA
、BC
、CA
、CB
通过与列对应的块的最大值。例如,在 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) * mat
与 mat
相同,除了所有非对角线块都被清零。
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])
这个问题是我
#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
我想标准化块间,即AB
、AC
、BA
、BC
、CA
、CB
通过与列对应的块的最大值。例如,在 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) * mat
与 mat
相同,除了所有非对角线块都被清零。
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])