y = a⊗a⊗a
を計算します。a
はn行1列のベクトルで、⊗
はouter product operatorです。この場合、y
はn行n行nテンソルでなければなりません。matlabで、1つのショットで2つ以上の行列の外積を取る方法は?
y = a⊗a
の場合は簡単です。私は単純に次のようにします:
y = a * a'
最初の場合はどうすればいいですか? 2つ以上のベクトルがある場合、MATLABでこの外側の製品を効率的に計算するにはどうすればよいですか?
y = a⊗a⊗a
を計算します。a
はn行1列のベクトルで、⊗
はouter product operatorです。この場合、y
はn行n行nテンソルでなければなりません。matlabで、1つのショットで2つ以上の行列の外積を取る方法は?
y = a⊗a
の場合は簡単です。私は単純に次のようにします:
y = a * a'
最初の場合はどうすればいいですか? 2つ以上のベクトルがある場合、MATLABでこの外側の製品を効率的に計算するにはどうすればよいですか?
y = u⊗v
の多次元(テンソル)の場合、私はあなたがそうのような第二オペランドの寸法をシフトする必要があると信じている。そして、
v_t = permute(v, circshift(1:(ndims(u) + ndims(v)), [0, ndims(u)]));
とbsxfun
でそれらを掛ける:
y = bsxfun(@times, u, v_t);
通常の行列乗算はベクトル行列と2次元行列に対してのみ定義されているため、通常の場合は使用できません。 はベクトルの場合は1ではなく2を返すため、第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)
たりするときに必要な4の外側(クロネッカーテンソル)製品:
kron(kron(a * a', a), a)
のように。最後のものはmxn行列です。ここで、m = n * n * nです。その上
reshape(kron(a * a', a), [n, n, n])
または
reshape(kron(kron(a * a', a), a), [n, n, n, n])
と:追加寸法は製品で起こってとして所望される場合
、あなたはreshape
機能を使用することができます。最後のものはn x n x n x nテンソルです。
kron
をa previous solutionとして使用した場合の問題は、外側の製品の正規の索引付けを中止することです。
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
クロネッカー積のアプローチ
を使用する: 紙に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
がデータキューブであることを確認することができます。
代わりに、ndgrid
はこのシナリオのために理想的です
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
のスライスを含まないためです。このように外積を計算するには、kron(a * b', c)
の要素に再配置演算/関数(決定可能ではあるが、労力と時間がかかります)を適用する必要があります。
ndgrid
を使用することのさらなる利点は、それがより高次に容易に一般化されることです。
私はあなたが計算したいものを理解していません。それは 'y = a x a x a'ですか?そうであれば、オペランドの1つが行列のときに、外積はどのように定義されますか? –
はい、y = a x a x aを計算します。または、より高次のもの、y = a x a x a x a x a。 –