矢量化matlab列标准化

时间:2013-04-08 09:27:36

标签: matlab normalization vectorization

我想对每列的矩阵进行标准化。我现在有这个代码可以正常工作:

A = randn(10,3)

maxA = max(A,[],1)
minA = min(A,[],1)

for i=1:size(A,2)
    A(:,i) = (A(:,i) - minA(i) ./ (maxA(i) - minA(i))
end

然而,由于我的矩阵会更大,所以大约10k到60k的循环将需要永远。我怎么能矢量化我的代码? 我曾想过使用Matlab的normc,但这与我的代码不一样。

2 个答案:

答案 0 :(得分:5)

您可以使用bsxfun

A = randn(10,3)

maxA = max(A,[],1)
minA = min(A,[],1)

bsxfun(@minus, A, minA ./ abs(maxA - minA))

但是,我不太明白你的正常化。不会使用

(A(:,i) - minA(i)) ./ (maxA(i) - minA(i))

规范化?如果是这样,bsxfun语句应为:

bsxfun(@times, bsxfun(@minus, A, minA), 1./abs(maxA - minA))

答案 1 :(得分:0)

一般情况下可能是:

A = (A - ones(size(A)) * diag(minA)) / diag(maxA - minA);

A = (A - ones(size(A)) * diag(minA)) * diag(1 ./ (maxA - minA));

但考虑到尺寸:

m = repmat(minA, size(A, 1), 1);
n = repmat(maxA - minA, size(A, 1), 1);
A = (A - m) ./ n;