我想根据我的算法编写完整的多元多项式的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];
如何为不同维度和不同订单编写代码?
答案 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
达到的目标相同。
这适用于不同的订单。对于不同的维度,我会将所有内容放入函数中并将其级联。