我想根据我的算法为全多元多项式编写如下的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]  .......

我不能用内置的bsxfun生成这个它需要避免重复的术语,因为当x1x2相乘时,我希望避免将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];

如何为不同的维度和不同的顺序编写代码?

最佳答案

我不太确定是否一切都对但我想这就是你要找的。
也许可以进一步矢量化。

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

基本上,除了附加的if条件外,使用bsxfun可以达到相同的效果。
适用于不同的订单。对于不同的维度,我会把所有的东西都放进一个函数中并将其级联。

09-30 14:09
查看更多