[討論] 向量化

作者: azurebible   2017-02-28 13:29:38
當n=2時, 對i=1和i=2,分別有向量x_i=(x_i1,x_i2)。
想求算以下兩個矩陣
[x_11*x_11 x11*x_12; x12*x_11 x_12*x_12]
和 [x_21*x_21 x21*x_22; x22*x_21 x_22*x_22]
我可透過下面的code求算一般化的情況。
rng('default')
n = 100;
X = rand(n);
Y = cell(n,1);
for i = 1:n
Y{i} = bsxfun(@times,X(:,i),transpose(X(:,i)));
end
如果想避開迴圈,我可以寫出
rng('default')
n = 100;
X = rand(n);
W = bsxfun(@times,X(:),transpose(X(:)));
position = repmat({ones(n,n)},n,1);
Z = W(logical(blkdiag(position{:})));
Z = reshape(Z,n*n,n);
忽略掉cell 和matrix 的差別,再重排Z矩陣後,
Z就相當於前述的Y。
不過,當n=1000時,第二個方法會產生下面的問題:
Error using bsxfun
Requested 1000000x1000000 (7450.6GB) array exceeds
maximum array size preference. Creation of arrays
greater than this limit may take a long time and
cause MATLAB to become unresponsive.
原因在於第二個方法,計算了許多不必要的元素
bsxfun(@times,X(:,i),transpose(X(:,j))) % 當i和j不相等
想請問是否能夠避開迴圈,而且沒有第二個方法的困擾,
計算每一個
Y{i} = bsxfun(@times,X(:,i),transpose(X(:,i)))
謝謝。
作者: sunev (Veritas)   2017-02-28 13:45:00
Y=bsxfun(@times,permute(X,[1 3 2]),permute(X,[3 1 2]));

Links booklink

Contact Us: admin [ a t ] ucptt.com