當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)))
謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 136.152.142.113
※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1488259781.A.46F.html
※ 編輯: azurebible (136.152.142.113), 02/28/2017 13:31:56
推
02/28 13:45, , 1F
02/28 13:45, 1F
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章