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)

加上 order=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]  .......

我无法使用内置的bsxfun. 它需要避免重复的术语,因为当x1乘以时x2,我想避免x2乘以x1

最终结果应该是这样的:

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 回答