【问题标题】:Compute all d-dimensional monomials of degree less than k计算所有度数小于 k 的 d 维单项式
【发布时间】:2016-11-09 18:44:01
【问题描述】:

我想计算所有度数小于 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。在上面的解决方案中,我必须为每个学位添加一个新的(更深的)嵌套循环。

我知道这似乎是一个失败的微不足道的问题,但我无法理解它。我感谢所有建议。

【问题讨论】:

    标签: arrays matlab loops nested-loops


    【解决方案1】:

    您正在尝试进行一种分区,特别是您希望将 k 中的所有 integer partitions 查找到 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 值。

    【讨论】:

    • 谢谢你,托科特!这是一个非常好的和简单的解决方案。
    【解决方案2】:

    检查我的 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。如果您在查看后需要任何进一步的帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 1970-01-01
      • 2018-05-31
      • 2021-12-29
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多