我想計算y = a⊗a⊗a
,其中a
是n×1矢量,並⊗
是outer product operator。在這種情況下,y
應該是一個n乘n的張量。如何在matlab中一次拍攝兩個以上矩陣的外積?
如果y = a⊗a
,很容易。我只是這樣做:
y = a * a'
但在第一種情況下該怎麼辦?如果有兩個以上的向量,我如何在MATLAB中高效地計算這個外部產品?
我想計算y = a⊗a⊗a
,其中a
是n×1矢量,並⊗
是outer product operator。在這種情況下,y
應該是一個n乘n的張量。如何在matlab中一次拍攝兩個以上矩陣的外積?
如果y = a⊗a
,很容易。我只是這樣做:
y = a * a'
但在第一種情況下該怎麼辦?如果有兩個以上的向量,我如何在MATLAB中高效地計算這個外部產品?
在y = u⊗v
多維(張量)情況下,我認爲,你需要第二個操作數的尺寸轉移,像這樣:他們bsxfun
v_t = permute(v, circshift(1:(ndims(u) + ndims(v)), [0, ndims(u)]));
,然後乘:
y = bsxfun(@times, u, v_t);
常規矩陣乘法僅被定義爲向量和2- d矩陣,所以我們不能在一般情況下使用它。
另請注意,如果第二個操作數是一維矢量,則此計算仍然失敗,因爲ndims
對矢量返回2而不是1。爲此,讓我們自己定義的函數,計算尺寸:
my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));
要完成的回答,您可以定義一個新的功能(如匿名函數),像這樣:
outprod = @(u, v)bsxfun(@times, u, permute(v, circshift(1:(my_ndims(u) + my_ndims(v)), [0, my_ndims(u)])));
然後根據需要多次使用它。例如,y = a×a×a
將計算如下所示:
y = outprod(outprod(a, a), a);
當然,你可以寫一個更好的函數採用可變數量的參數,爲您節省一些打字。沿着這些線:
function y = outprod(u, varargin)
my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x));
y = u;
for k = 1:numel(varargin)
v = varargin{k};
v_t = permute(v, circshift(1:(my_ndims(y) + my_ndims(v)),[0, my_ndims(y)]));
y = bsxfun(@times, y, v_t);
end
我希望我得到了正確的數學!
您可以使用爲好kron
功能:
kron(a * a', a)
,或者當需要四個外(克羅內克張量)產品:
kron(kron(a * a', a), a)
等。最後一個給出了一個矩陣,其中m = n * n * n。
如果添加尺寸也希望能與產品回事,你可以使用reshape
功能:
reshape(kron(a * a', a), [n, n, n])
或
reshape(kron(kron(a * a', a), a), [n, n, n, n])
等。最後一個給出了一個n張n×n×n×張量。
與a previous solution一樣使用kron
的問題在於它拋棄了外部產品的規範索引。
相反,ndgrid
非常適合這樣的場景:
a = [1; 2; 3];
b = [4; 5];
c = [6; 7; 8; 9];
[xx, yy, zz] = ndgrid(1:length(a), 1:length(b), 1:length(c));
% desired outerproduct
M = a(xx) .* b(yy) .* c(zz);
在紙面上,我們可以檢查所需的解決方案M
是數據立方體:
M(:,:,1) = | M(:,:,2) = | M(:,:,3) = | M(:,:,4) =
| | |
24 30 | 28 35 | 32 40 | 36 45
48 60 | 56 70 | 64 80 | 72 90
72 90 | 84 105 | 96 120 | 108 135
使用克羅內克積方法
M2 = reshape(kron(a * b', c), [length(a), length(b), length(c)]);
我們會得到:
M2(:,:,1) = | M2(:,:,2) = | M2(:,:,3) = | M2(:,:,4) =
| | |
24 36 | 64 84 | 30 45 | 80 105
28 48 | 72 96 | 35 60 | 90 120
32 56 | 72 108 | 40 70 | 90 135
數據立方體M2
具有相同的元件M
,但這些元素重新排列。這是因爲kron(a * b', c)
不包含連續塊中的M
切片,以便於直接應用reshape
函數。要通過這種方式計算外部產品,我們需要對kron(a * b', c)
的元素應用重排操作/功能(可確定,但非常耗時且耗時)。
使用ndgrid
的另一個優點是它可以輕鬆地推廣到更高的訂單。
我不明白你想要計算什麼。它是'y = a x a x a'嗎?如果是這樣,當其中一個操作數是矩陣時,外部產品如何定義? –
是的,我想計算y = a x a x a。或者更高階的例如,y = a x a x a x a x a。 –