2016-01-09 146 views
0

給定一個矩陣X具有任意數量的列和行(每行代表數據集的一個特徵),我想將每個值標準化爲((value - column mean)/column standard deviation)。我想出了下面的代碼,它的工作原理。這可以針對較少的計算進行優化,還是最優的?優化功能規範化代碼

mu = mean(X); 
sigma = std(X); 
x_ones = ones(size(X)); 
zero_mean_X = X - x_ones * diag(mu); 
X_norm = zero_mean_X ./ (x_ones * diag(sigma)); 

回答

2

下面是使用bsxfun優化從MATLAB

M = mean(X); 
S = std(X); 
Y = bsxfun(@minus,X, M); 
Y = bsxfun(@rdivide, Y, S); 

它是快了4倍

enter image description here

X = rand(1000); 

t = zeros(100,2); 
for ii = 1:100 
    tic; 
    M = mean(X); 
    S = std(X); 
    Y = bsxfun(@minus,X, M); 
    Y = bsxfun(@rdivide, Y, S); 
    t(ii,1) = toc; 
end 


for ii = 1:100 
    tic; 
    mu = mean(X); 
    sigma = std(X); 
    x_ones = ones(size(X)); 
    zero_mean_X = X - x_ones * diag(mu); 
    X_norm = zero_mean_X ./ (x_ones * diag(sigma)); 
    t(ii,2) = toc; 
end 

figure('Color', 'w'); 
plot(t); 
legend({'bsxfun', 'matrix'}); 
xlabel('NUmber of simulations'); 
ylabel('Time'); 
+0

完美。謝謝。速度測試是一個不錯的獎勵。有好的工具。 – Laizer

+0

等待接受答案之前 - 一些電力用戶可能加入派對! – marsei

+1

@marsei沒有比'bsxfun'更好的方式去做了。事實上,我標記的重複使用這是做這件事的最好方法。 – rayryeng