MATLAB - bsxfun for negative values



我正在使用命令

规范化一个数据集
X=bsxfun(@times,bsxfun(@minus,X,min(X,[],1)),1./max(X,[],1))

我在两个不同的数据集上尝试了这个函数。一个也有负值。其他的没有。没有负值的数据集在0到1之间得到了完美的归一化。而负值没有被正确归一化。这个问题能解决吗?是否有另一种方法,我可以规范化与负值的数据集?

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

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

Y = bsxfun(@minus, X, min(X));
X_normalized = bsxfun(@rdivide, Y, max(Y));

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

更多说明:

  1. min(X, [], 1)可缩写为min(X)max也是如此。
  2. 代替bsxfun中的times乘以1 ./ max(Y),你可以使用rdivide

希望这对你有帮助!

好吧,这篇文章真的让我很困扰。

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

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

我得到了一个答案:

Elapsed time is 0.004130 seconds.
Elapsed time is 0.002468 seconds.

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

Elapsed time is 0.003342 seconds.
Elapsed time is 0.395347 seconds.

然而,我对结果并不满意,我决定进行多次测试,以确保这不是一个偶然事件。这就是它开始令人不安的时候。

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对于大数据。然而,在这两种情况下,它都比sxfun更快,并且需要更多的时间来计算集合的第一次时间。

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循环之外使用X=magic(3)进行计算,bsxfun的值总是大于arrayfun的值。

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.

有什么提示吗

相关内容

  • 没有找到相关文章

最新更新