首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中矩阵归一化的快速技术

MATLAB中矩阵归一化的快速技术
EN

Stack Overflow用户
提问于 2010-12-24 02:52:01
回答 7查看 48.2K关注 0票数 10

我想在Matlab中对矩阵的每一列进行标准化。我尝试了两种实现:

选项A:

代码语言:javascript
复制
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:

代码语言:javascript
复制
mn=mean(x);
sdx=std(x);
for i=1:size(x,1)
    xn(i,:)=(x(i,:)-mn)./(sdx+(sdx==0));
end

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-24 02:59:32

记住,在MATLAB中,矢量化=速度。

如果A是M×N矩阵,

代码语言:javascript
复制
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
票数 8
EN

Stack Overflow用户

发布于 2010-12-24 02:58:00

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

要标准化mean和std,您可以这样写

代码语言:javascript
复制
mn = mean(x);
sd = std(x);
sd(sd==0) = 1;

xn = bsxfun(@minus,x,mn);
xn = bsxfun(@rdivide,xn,sd);
票数 15
EN

Stack Overflow用户

发布于 2013-09-28 04:32:58

假设X是一个m x n矩阵,您想要按列规范化。

下面的matlab代码可以做到这一点。

代码语言:javascript
复制
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提到的,这只是一个更快的解决方案,并执行与遍历矩阵相同的任务。这个内置函数的底层实现使其工作速度更快

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4521593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档