首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于负值的MATLAB - bsxfun

用于负值的MATLAB - bsxfun
EN

Stack Overflow用户
提问于 2013-03-12 21:01:14
回答 2查看 668关注 0票数 0

我正在使用以下命令对数据集进行规范化

代码语言:javascript
复制
X=bsxfun(@times,bsxfun(@minus,X,min(X,[],1)),1./max(X,[],1))

我在两个不同的数据集上尝试了这个函数。其中一个也有负值。其他人没有。没有负值的数据集在0到1之间得到了完美的归一化。具有负值的那个没有正确归一化。这个问题能解决吗?有没有其他方法可以将数据集归一化为负值?

EN

回答 2

Stack Overflow用户

发布于 2013-03-12 21:12:40

罪魁祸首在于你的规范化。从X中减去min(X),然后除以max(X),而不是除以max(X - min(X))

你应该做的是把它分成两个步骤:

代码语言:javascript
复制
Y = bsxfun(@minus, X, min(X));
X_normalized = bsxfun(@rdivide, Y, max(Y));

请注意,无论对于正值还是负值,这都不能正常工作。

还有一些注意事项:

  1. min(X, [], 1)可以缩写为min(X)。同样的道理也适用于在max.
  2. Instead中使用times乘以1 ./ max(Y),您可以使用rdivide.

希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2013-03-13 17:04:58

好吧,这篇文章真的让我很不安。

我从来没听说过bsxfun。我用的是arrayfun,cellfun,structfun。所以我想知道为什么要使用它,我想我很快就会找到答案的。所以我做了一个愚蠢的测试:

代码语言:javascript
复制
X = magic(3);
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
toc

tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
toc

我得到了一个答案:

代码语言:javascript
复制
Elapsed time is 0.004130 seconds.
Elapsed time is 0.002468 seconds.

,这使我认为arrayfun是一种可行的方法。但是,由于X是小数据,所以我尝试使用更大的X (X = magic(100);),因此可能会发生arrayfun更快的情况。当然,bsxfun要快得多,这意味着我需要重新编写一些东西。

代码语言:javascript
复制
Elapsed time is 0.003342 seconds.
Elapsed time is 0.395347 seconds.

然而,由于对结果不够满意,我决定多次运行测试,以确保不会造成人员伤亡。这就是它开始变得令人不安的时候。

代码语言:javascript
复制
test= repmat({zeros(2,10)},2,1);
Xsizes = [3 100];
for ii=1:2,for jj=1:10
X = magic(Xsizes(ii));
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
test{ii}(1,jj)=toc;


tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
test{ii}(2,jj)=toc;

end;end

display('small Size data')
test{1}
display('Big Size data')
test{2}

对于小数据,答案总是更快的arrayfun,对于大数据,答案是更快的bsxfun。然而,它在两种情况下都更快,并且需要更多的时间来计算集合的第一次。

代码语言:javascript
复制
small Size data

ans =

   1.0e-03 *

    0.4900    0.0470    0.0430    0.0410    0.0410    0.0420    0.0420    0.0410    0.0420    0.0410
    0.6600    0.4200    0.4040    0.3890    0.3920    0.3900    0.3920    0.3890    0.3960    0.3900

Big Size data

ans =

    0.0003    0.0001    0.0001    0.0001    0.0001    0.0001    0.0002    0.0001    0.0001    0.0001
    0.3853    0.3871    0.3846    0.3855    0.3874    0.3844    0.3863    0.3840    0.3860    0.3853

这让我很困惑。更重要的是,如果在for循环和bsxfun之外再次使用X=magic(3)进行计算,则总是比arrayfun占用更多的资源。

代码语言:javascript
复制
Elapsed time is 0.004891 seconds.
Elapsed time is 0.002008 seconds.



Elapsed time is 0.003181 seconds.
Elapsed time is 0.001994 seconds.



Elapsed time is 0.003109 seconds.
Elapsed time is 0.002008 seconds.

有什么提示吗?

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

https://stackoverflow.com/questions/15361988

复制
相关文章

相似问题

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