2016-06-13 3 views
2

의 지정된 차원 내에서 배열을 정규화하려고합니다. 정규화하면 각 요소를 관련 차원에 대한 합계로 나눕니다.배열을 정규화

배열을 표준화하는 치수가 주어진 계산을 자동화하고 싶습니다. 과 같은 함수가 각각 출력을 생성하는 데 사용됩니다. 필요한 총계를 생성 할 수는 있지만 일관된 기법으로 정규화 할 수는 없습니다.

a = array(1:8, c(2,2,2)) 

dm = 1 # dimension to sum over 
ndim = length(dim(a)) 
margin = setdiff(seq_len(ndim), dm) # dimensions to keep in apply 
a/rep(apply(a, margin, sum), each=2) 

, , 1 

      [,1]  [,2] 
[1,] 0.3333333 0.4285714 
[2,] 0.6666667 0.5714286 

, , 2 

      [,1]  [,2] 
[1,] 0.4545455 0.4666667 
[2,] 0.5454545 0.5333333 


dm = 3 # dimension to sum over 
ndim = length(dim(a)) 
margin = setdiff(seq_len(ndim), dm) 
a/rep(apply(a, margin, sum), times=2) 
# but for this dimension `times`, instead of `each` was used 

, , 1 

      [,1]  [,2] 
[1,] 0.1666667 0.3000000 
[2,] 0.2500000 0.3333333 

, , 2 

      [,1]  [,2] 
[1,] 0.8333333 0.7000000 
[2,] 0.7500000 0.6666667 


#for dim=2 the denominator is more difficult to generate 
dm = 2 # dimension to sum over 
a/c(4,6,4,6,12,14,12,14) 

는 루프를 사용하지 않는 것이 바람직 할 것이지만

MWE는 (등 적용 포함), 모든 솔루션을 환영합니다. 감사합니다 (그것은이 더 정직 할 것이다 단지 2 × 2 배열 인 경우) 매트릭스에, 코멘트에 예를 들어 요청으로


a = array(1:4, c(2,2)) 
a 
#  [,1] [,2] 
#[1,] 1 3 
#[2,] 2 4 
dm = 1 # dimension to sum over 
ndim = length(dim(a)) 
margin = setdiff(seq_len(ndim), dm) # dimensions to keep in apply 
apply(a, margin, sum) 
# [1] 3 7 
a/rep(apply(a, margin, sum), each=2) 
#   [,1]  [,2] 
#[1,] 0.3333333 0.4285714 
#[2,] 0.6666667 0.5714286 

dm = 2 # dimension to sum over 
ndim = length(dim(a)) 
margin = setdiff(seq_len(ndim), dm) # dimensions to keep in apply 
apply(a, margin, sum) 
# [1] 4 6 
a/rep(apply(a, margin, sum), times=2) 
#   [,1]  [,2] 
#[1,] 0.2500000 0.7500000 
#[2,] 0.3333333 0.6666667 
+0

2x2 행렬, 주어진 차원, 해당 행렬 및 차원으로 계산되는 합계 및 해당 정규화 된 행렬의 예를 제공 할 수 있습니까? – cameronroytaylor

+1

@cameronroytaylor; 내가 업데이트했습니다, 타이 – user2957945

답변

3

사용하여 얻을 수 있습니다 추구 일관성 sweep :

normalize <- function(a,dm){ 
    ndim <- length(dim(a)) 
    margin <- setdiff(seq_len(ndim),dm) 
    sweep(a,margin,apply(a, margin, sum),"/") 
} 

그런 다음 normalize(a,1), normalize(a,2)normalize(a,3) 원하는 배열로 단순화 할 수 있습니다.

+0

존, 이거 정말 대단해, ​​고마워. – user2957945