基于算法的完全多元多项式代码

时间:2013-09-29 08:29:02

标签: algorithm matlab matrix

我想根据我的算法编写完整的多元多项式的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];

如何为不同维度和不同订单编写代码?

1 个答案:

答案 0 :(得分: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

result = [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

除了额外的if条件外,基本上与bsxfun达到的目标相同。 这适用于不同的订单。对于不同的维度,我会将所有内容放入函数中并将其级联。