我想在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秒。那么,还有更好的解决方案吗?
答案 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)
让X
为m 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中找到。
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), :); %标准化列