我想在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秒。因此,有没有更好的解决方案?
发布于 2010-12-24 02:59:32
记住,在MATLAB中,矢量化=速度。
如果A是M×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发布于 2010-12-24 02:58:00
使用bsxfun代替循环。这可能会快一点;但是,它也可能使用更多的内存(在您的情况下,这可能是一个问题;如果您正在分页,那么一切都会非常慢)。
要标准化mean和std,您可以这样写
mn = mean(x);
sd = std(x);
sd(sd==0) = 1;
xn = bsxfun(@minus,x,mn);
xn = bsxfun(@rdivide,xn,sd);发布于 2013-09-28 04:32:58
假设X是一个m x n矩阵,您想要按列规范化。
下面的matlab代码可以做到这一点。
XMean = repmat(mean(X),m,1);
XStd = repmat(std(X),m,1);
X_norm = (X - XMean)./(XStd);这里解释了元素WIS./运算符:http://www.mathworks.in/help/matlab/ref/arithmeticoperators.html
注意:正如op提到的,这只是一个更快的解决方案,并执行与遍历矩阵相同的任务。这个内置函数的底层实现使其工作速度更快
https://stackoverflow.com/questions/4521593
复制相似问题