2013-04-08 115 views
3

我想標準化每列的矩陣。我現在有這樣的代碼工作正常:向量化matlab列標準化

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 

然而,由於我的矩陣將是更大的,由60K循環大約10K將永遠需要。我如何矢量化我的代碼? 我曾經想過使用Matlab的normc,但那不會和我的代碼一樣。

回答

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

事實上,你對正常化是正確的。我實際上在Matlab中做了正確的操作,但手動輸入時我錯誤地複製了它。該方法完美地工作。 – Tim 2013-04-08 13:19:39

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;