3

我想规范化每列的矩阵。我现在有这个工作正常的代码:

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 x 60k 循环将永远持续下去。如何矢量化我的代码?我曾想过使用 Matlab normc,但这与我的代码不同。

4

2 回答 2

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))
于 2013-04-08T09:36:55.083 回答
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;
于 2013-04-08T17:41:01.070 回答