これを投稿するのは恥ずかしいです-もっと簡単な方法があるはずです(もっと簡単な方法があります-答えの下部にある私の12月の更新を参照してください)が、これでうまくいきます:
A = [1 2 3; 4 5 6];
n = size(A, 2);
B = A(:, reshape(ones(n, 1) * (1:n), 1, n^2)) .* repmat(A, 1, n);
Soln = [A, B(:, logical(reshape(tril(toeplitz(ones(n, 1))), 1, n^2)'))];
このステップでは、実際に必要な組み合わせの数の2倍を計算するため、計算は効率的ではありませんB
(つまり、c1。* c1、c1。* c2、c1。* c3、c2。* c1、c2。* c2、 c2。*c3、c3。* c1、c3。* c2、c3。* c3)、次に2番目のステップで、必要な列のみを引き出します(たとえば、c3。*c1を削除します)。すでにc1。*c3などを取得しています)。
更新:ちょうど運転していて、はるかに良い方法が私に起こりました。次の形式の2つのインデックスベクトルを作成する必要があります:I1 = [1 1 1 2 2 3]
とI2 = [1 2 3 2 3 3]
、すると、(A(:, I1) .* A(:, I2))
必要なすべての列積が得られます。私は現在コンピュータから離れていますが、後で戻って、インデックスベクトルを構築するための一般的な方法を考え出します。構造を使えばかなり簡単に達成できると思いますtril(toeplitz)
。乾杯。数時間で更新されます。
更新: Rodyの2番目の解決策(+1)は、以前の更新で私が念頭に置いていたものとまったく同じなので、彼が今そこで行ったことをわざわざ繰り返すことはしません。ヨーダも実はかなり綺麗なので、さらに+1。
12月の更新:おかしなことに、ここで作業した後、私は自分の研究のためにこの問題を再検討する必要がありました(不均一分散性のホワイトのテストをコーディングします)。私は実際に新しいアプローチを支持しており、コメントで@slaytonによって(やや不可解に)推奨されています。具体的には、を使用しnchoosek
ます。私の新しいソリューションは次のようになります。
T = 20; K = 4;
X = randi(100, T, K);
Index = nchoosek((1:K), 2);
XAll = [X, X(:, Index(:, 1)) .* X(:, Index(:, 2)), X.^2];
nchoosek
クロス積をすばやく簡単に構築するために必要なインデックスを正確に生成します。