2016-04-28 132 views
0

作为比喻,考虑图像中像素的颜色。假设我们有一个三维数组,表示沿维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

#with lmo's example 
temp - (1:3)[slice.index(temp, 3)] 

row/col,它创造了平等的“暗淡”的整数数组作为输入,可能会比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) 
相关问题