2017-05-26 64 views
1

我需要計算一個巨大陣列上所有列的平均值,我必須首先用零替換所有小於零的數字。以我的玩具爲例,很明顯這些計算需要相當長的時間。MATLAB:在一個巨大的陣列上計算平均值

tmp = -5 + 10 * rand(5000,100000); 

tmp(tmp<0) = 0; 
result = mean(tmp); 

我想知道是否有更好的方法來獲得一些速度?

+3

你沒有考慮到只有非負數。你用0代替負數,這是另一回事。此外,您正在計算每列的平均值;那是你要的嗎? –

+0

@LuisMendo是的,這正是我想要的。 – Andi

+1

換句話說,'a = [ - 10 -10 10 11]'。你想要「a」,「10.5」的「正面意思」,但是你這樣做的方式是採用「5.25」的「[0 0 10 11]」的意思。試試'result = mean(tmp(tmp> = 0))' –

回答

4

在數組中查找值然後替換它們是非常昂貴的操作。相反,做到以下幾點:

% slooooooow 
tic 
tmp(tmp<0)=0; 
mean(tmp); 
toc 

% faaaaaaaaaast 
tic 
tmp=max(tmp,0); 
mean(tmp); 
toc 

在我的電腦,這樣的報道:

Elapsed time is 5.940434 seconds. 
Elapsed time is 0.358057 seconds. 

請記住,如果你期望一個平均值,你應該叫mean(tmp(:))