2017-05-24 10 views
0

この質問はフォローアップの対象ですprevious question ローカルの最大値でブロックを正規化するのではなく、ブロックの最大値でブロックを正規化します。ブロックに対応する。 Iとの間ブロック正規化したいブロック間をブロックに対応するブロックの最大値で正規化する

#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 

、即ち、ABACBABC、列に対応するブロックの最大値によってCACB。例えば、ABの場合との間のブロックABないこのブロックの最大値によって正規化する。この場合、CC

> 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 

max()によってBBmax()、及びACことによってそれを正規化(すなわち44)であるが、ブロックBB(すなわち45)の最大値である。

すべてのポインタが高く評価されています!

答えて

1

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]) 
+0

美しいです!どうもありがとう! –

関連する問題