0

次のように、アルゴリズムに基づいて完全な多変量多項式の Matlab コードを書きたいと思います。

次があるとします。

A=[1 2 3 4;
   5 6 7 8]

ここでの入力次元は L=4 で、行数は M=2 です。完全な多変量多項式を作成するには、畳み込みまたは bsxfunc 組み込み関数を使用したいと考えています。ただし、カスタマイズしたアルゴリズムによると、少し異なります。

(多項式の次数が 2 の場合、次のように次元を書きましょう):

[X1.X1  X1.X2  X1.X3  X1.X4 ; X2.X2  X2.X3  X2.X4 ; X3.X3  X3.X4 ;  X4.X4]

すべての条件order=2は上記のとおりです。についてorder=3は、次のとおりです。

X1.*(the first column of above)
X2.*(the second column of above)
X3.*(the third column of above)
X4.*(the forth column of above)

プラス注文の前の結果= 2。

R=1 の場合: M1 は完全多変量多項式モードの項数です。

R=2  :    (adding previous terms to following terms)
X1 . M1=[X1.X1;X1.X2;X1.X3;X1.X4]  ,  X2 . M2=[X2.x2; X2.X3; X2.X4]  .......

組み込みを使用してこれを生成することはできませんbsxfunx1が を掛けるときに を掛けるのをx2避けたいので、繰り返し項を避ける必要があります。x2x1

最終結果は次のようになります。

Res=[1    5;
     2    6; 
     3    7; 
     4    8; 
     1   25; 
     2   30; 
     3   35; 
     4   40; 
     4   36; 
     6   42; 
      ...  ;
   4^4 8^4];

さまざまな次元とさまざまな順序のコードを作成するにはどうすればよいですか?

4

1 に答える 1

1

すべてが正しいかどうかはよくわかりません。しかし、それがあなたが探しているものだと思います。さらにベクトル化できるかもしれません。

A = [ 1, 2, 3, 4 ; 
      5, 6, 7, 8 ];

L = length(A);
X = A(1,:);
Y = A(2,:);
for ii = 1:1:L-1
    X = [ X , A(1,:).^(ii+1)];
    Y = [ Y , A(2,:).^(ii+1)];
    if ii < L/2
    X = [ X , A(1,:).*circshift(A(1,:)',ii)'];
    Y = [ Y , A(2,:).*circshift(A(2,:)',ii)'];  
    end
end

結果 = [ X' , Y' ]

以下につながります:

 results =
   1           5
   2           6
   3           7
   4           8
   1          25
   4          36
   9          49
  16          64
   4          40
   2          30
   6          42
  12          56
   1         125
   8         216
  27         343
  64         512
   1         625
  16        1296
  81        2401
 256        4096

bsxfun基本的に、追加の if 条件を除いて、 で到達できるものと同じです。それはさまざまな注文で機能します。さまざまな次元については、すべてを関数に入れてカスケードします。

于 2013-09-29T16:25:24.413 に答える