2016-01-09 108 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