我想根据我的算法为全多元多项式编写如下的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
生成这个它需要避免重复的术语,因为当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];
如何为不同的维度和不同的顺序编写代码?
最佳答案
我不太确定是否一切都对但我想这就是你要找的。
也许可以进一步矢量化。
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
可以达到相同的效果。适用于不同的订单。对于不同的维度,我会把所有的东西都放进一个函数中并将其级联。