在MATLAB中对矩阵进行归一化的快速技术

时间:2010-12-23 18:52:01

标签: matlab normalization performance

我想在Matlab中规范化矩阵的每一列。我尝试了两种实现方式:

选项A:

mx=max(x);
mn=min(x);
mmd=mx-mn;
for i=1:size(x,1)
    xn(i,:)=((x(i,:)-mn+(mmd==0))./(mmd+(mmd==0)*2))*2-1; 
end

选项B:

mn=mean(x);
sdx=std(x);
for i=1:size(x,1)
    xn(i,:)=(x(i,:)-mn)./(sdx+(sdx==0));
end

然而,这些选项对我的数据花费了太多时间,例如:在5000x53矩阵上3-4秒。那么,还有更好的解决方案吗?

7 个答案:

答案 0 :(得分:15)

使用bsxfun代替循环。这可能会快一些;但是,它也可能使用更多的内存(在你的情况下这可能是一个问题;如果你正在分页,一切都会非常慢)。

要用mean和std标准化,你要写

mn = mean(x);
sd = std(x);
sd(sd==0) = 1;

xn = bsxfun(@minus,x,mn);
xn = bsxfun(@rdivide,xn,sd);

答案 1 :(得分:8)

请记住,在MATLAB中,vectorizing = speed。

如果A是M x N矩阵,

A = rand(m,n);
minA = repmat(min(A), [size(A, 1), 1]);
normA = max(A) - min(A);               % this is a vector
normA = repmat(normA, [length(normA) 1]);  % this makes it a matrix
                                       % of the same size as A
normalizedA = (A - minA)./normA;  % your normalized matrix

答案 2 :(得分:3)

Xm x n矩阵,您希望按列进行标准化。

以下matlab代码可以做到

XMean = repmat(mean(X),m,1);
XStd = repmat(std(X),m,1);
X_norm = (X - XMean)./(XStd);

这里解释了元素明确的./运算符:http://www.mathworks.in/help/matlab/ref/arithmeticoperators.html

注意:如前所述,这只是一个更快的解决方案,并执行与循环矩阵相同的任务。这个内置函数的底层实现使其更快地工作

答案 3 :(得分:3)

注意:我没有提供新的答案,但我正在比较建议的答案。

选项A:使用bsxfun()

function xn = normalizeBsxfun(x)

    mn = mean(x);
    sd = std(x);
    sd(sd==0) = eps;

    xn = bsxfun(@minus,x,mn);
    xn = bsxfun(@rdivide,xn,sd);

end

选项B:使用for-loop

function xn = normalizeLoop(x)

    xn = zeros(size(x));

    for ii=1:size(x,2)
        xaux = x(:,ii);
        xn(:,ii) = (xaux - mean(xaux))./mean(xaux);
    end

end

我们比较了不同矩阵大小的两种实现方式:

expList = 2:0.5:5;
for ii=1:numel(expList)
    expNum = round(10^expList(ii));
    x = rand(expNum,expNum); 
    tic;
    xn = normalizeBsxfun(x);
    ts(ii) = toc; 
    tic;
    xn = normalizeLoop(x);
    tl(ii) = toc; 
end

figure;
hold on;
plot(round(10.^expList),ts,'b');
plot(round(10.^expList),tl,'r');
legend('bsxfun','loop');
set(gca,'YScale','log') 

结果表明,对于小矩阵,bsxfun更快。但是,差异是忽略了更高维度,因为它也可以在其他post中找到。

enter image description here

x轴是矩阵元素的平方根数,而y轴是以秒为单位的计算时间。

答案 4 :(得分:3)

注意:此代码适用于Octave和MATLAB版本R2016b或更高版本。

function X_norm = normalizeMatrix(X)      
      mu = mean(X); %mean    
      sigma = std(X); %standard deviation   
      X_norm = (X - mu)./sigma;    
end

答案 5 :(得分:1)

如何使用

normc(X)

将列矩阵X标准化。您需要在安装中包含神经网络工具箱。

答案 6 :(得分:-3)

这个怎么样?

A = [7,2,6; 3,8,4]; %a 2x3矩阵

Asum = sum(A); %总和列

Anorm = A./Asum(ones(size(A,1),1), :); %标准化列