计算所有小于k的d维单项式

时间:2016-11-09 18:44:01

标签: arrays matlab loops nested-loops

我想计算所有度数小于k的d维单项式 并按顺序将它们放入单元格数组--Pbase中(我使用Matlab,但这个问题也适用于其他语言)。 k和d由用户提供但是任意的。

到目前为止我做了什么,(名为degreeindex的数组显示了Pbase中某种程度的单项式的位置):

n=nchoosek(d+k,k);%i know there are n over k possibilities for such monomials
Pbase=cell(1,n);
degreeindex=zeros(k+1,3);%showing [degree, start, end]
x=sym('x',[d,1]);

%the polynomials of degree 0
Pbase{1}=1;
degreeindex(1,1:3)=[0,1,1];%initialized for degree 0

%degree 1 monomials
degree=2;
degreeindex(degree,:)=[degree-1,degreeindex(degree-1,3)+1,degreeindex(degree-1,3)+1];
for i=1:d
    Pbase{degreeindex(degree,2)+i-1}=x(i);
    degreeindex(degree,3)=degreeindex(degree,3)+1;
end

%degree2 monomials
degree=3;
degreeindex(degree,:)=[degree-1,degreeindex(degree-1,3),degreeindex(degree-1,3)+1];
for i=1:d
    for j=i:d
        Pbase{degreeindex(degree,3)-1}=x(i).*x(j);
        degreeindex(degree,3)=degreeindex(degree,3)+1;
    end
end

%degree3 monomials
degree=4;
degreeindex(degree,:)=[degree-1,degreeindex(degree-1,3),degreeindex(degree-1,3)+1];
for i1=1:d
    for i2=i1:d
        for i3=i2:d
        Pbase{degreeindex(degree,3)-1}=x(i1).*x(i2)*x(i3);
        degreeindex(degree,3)=degreeindex(degree,3)+1;
        end
    end
end
...

问题在于我没有找到一种方法来执行任意度k。在上面的解决方案中,我必须为每个度数包含一个新的(和更深的)嵌套循环。

我知道这似乎是一个琐碎的小问题,但我无法理解它。我很感激所有的建议。

2 个答案:

答案 0 :(得分:0)

您正在尝试进行某种类型的分区,特别是您希望将所有integer partitions个k找到m个或更少的部分(顺序很重要)。

使用nchoosek您可以轻松实现此目标(改编自Matlab文件交换,here):

d = 3; % num dims
k = 4; % degree
x=sym('x',[d,1]);
m = nchoosek(k+d-1,d-1); 
dividers = [zeros(m,1),nchoosek((1:(k+d-1))',d-1),ones(m,1)*(k+d)]; 
a = diff(dividers,1,2)-1;
PBase = cell(1, size(a,1));
for i = 1:size(a,1)
    PBase{i} = prod(x.' .^ a(i,:));
end

循环遍历您需要的任何k值。

答案 1 :(得分:0)

检查我的FileExchange提交以获取多元多项式回归。在内部,对于给定的度数,我计算具有任意度数的基多项式的所有单项式。它闪电般快,但代价是一些记忆。

MultiPolyRegress

这是相关部分:

% Function Parameters
NData = size(Data,1);
NVars = size(Data,2);
RowMultiB = '1';
RowMultiC = '1';
Lim = max(PV);

% Initialize
A=zeros(Lim^NVars,NVars);

% Create Colums Corresponding to Mathematical Base
for ii=1:NVars
    A(:,ii)=mod(floor((1:Lim^NVars)/Lim^(ii-1)),Lim);
end

% Flip - Reduce - Augment
A=fliplr(A); A=A(sum(A,2)<=Lim,:); Ab=diag(repmat(Lim,[1,NVars])); A=[A;Ab];

% Degree Conditionals
for ii=1:NVars
    A=A(A(:,ii)<=PV(ii),:);
end

请注意,没有明确的for循环依赖于幂,只有多项式中的变量数。还要注意潜在的巨大矩阵A.看看之后,如果您需要任何进一步的帮助,请告诉我。