2016-04-28 11 views
0

類似点として、画像内のピクセルの色を考慮してください。次元3に沿って積み上げられた行列の画像の赤、緑、青のチャンネルを表す3D配列があるとします。この画像全体から「色を減算する」最も簡単な方法は(長さ3のベクトルで表されます)、赤のチャンネル、緑のチャンネルの緑の成分、青のチャンネルの青の成分から赤の色の成分が差し引かれるという意味ですか?「3次元に沿ったベクトルの行列」内の各要素からベクトルを減算する

画像AとカラーVを考えると、私たちが行うことができます。

for(i : 1:3){ 
    A[,,i] <- A[,,i] - v[i] 
} 

または

A - array(rep(v,each=length(A[,,1])),dim(A)) 

これを行うための最善の方法は何ですか? rowcolのようなしかし第三次元の関数は(level言う)がある場合、私は単に

A - v[level(A)] 

を行うことができますが、このような機能か?

+0

を参照してください 'slice.index'。 'A - v [slice.index(A、3)]' –

+0

@alexis_lazパーフェクト。それを答えに入れることができますか? – Museful

答えて

1

同等またはrow/coldim() > 2ため?slice.indexです:それはあなたがしたいとより多くの何をします入力として

row/col同様
#with lmo's example 
temp - (1:3)[slice.index(temp, 3)] 

が、それは同じ「薄暗い」の整数配列を作成しますループはforループよりも非効率的になります。

とレコードのベンチマーク:?

f1 = function(x, v) 
{ 
    for(k in seq_len(dim(x)[3])) x[, , k] = x[, , k] - v[[k]] 
    return(x) 
} 

f2 = function(x, v) sweep(x, 3, v) 

f3 = function(x, v) x - v[slice.index(x, 3)] 

set.seed(911); ARR = array(runif(11), c(300, 300, 300)); V = sample(300) 

system.time({ ans1 = f1(ARR, V) }) 
# user system elapsed 
# 0.91 0.19 1.09 
system.time({ ans2 = f2(ARR, V) }) 
# user system elapsed 
# 1.20 0.06 1.26 
system.time({ ans3 = f3(ARR, V) }) 
# user system elapsed 
# 0.47 0.14 0.61 

identical(ans1, ans2) 
#[1] TRUE 
identical(ans2, ans3) 
#[1] TRUE 
0

sweepをご覧ください。

temp <- array(rep(c(1:3), each=25), dim=c(5, 5, 3)) 
# subtract 1 from matrix [,,1], 2 from matrix [,,2], 3 from matrix [,,3] 
sweep(temp, 3, 1:3) 
関連する問題