[讨论] 向量化

楼主: 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