[討論] 向量化

看板MATLAB作者時間7年前 (2017/02/28 13:29), 7年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
當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
Y=bsxfun(@times,permute(X,[1 3 2]),permute(X,[3 1 2]));
02/28 13:45, 1F
文章代碼(AID): #1OjGh5Hl (MATLAB)
文章代碼(AID): #1OjGh5Hl (MATLAB)