我想对每列的矩阵进行标准化。我现在有这个代码可以正常工作:
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
,但这与我的代码不一样。
答案 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;