2016-11-09 16 views
0

k度以下のすべてのd次元単項式を計算し、それらをセル配列-Pbaseに順番に入れたい(私はMatlabを使うが、このプロブレム他の言語にも適用されます)。 kとdはユーザによって提供されるが任意である。問題は、私はこれを行う方法を見つけていないということです次数がk未満のすべてのd次元単項式を計算する

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 
... 

:私はこれまで行われてきた、(degreeindexという配列がPbaseの中にある程度の単項式の場所を表示する)

任意の次数kである。上記のソリューションでは、すべての度合に対して新しい(さらに深い)ネストループを含める必要があります。

私はこれが不合理な問題だと思っていますが、私はその周りに頭を浮かべることはできません。私はすべてのアドバイスに感謝します。

答えて

0

パーティショニングのタイプを実行しようとしています。具体的には、kのすべてのinteger partitionsがm個以下の部分(注文に関係します)にあることがわかります。あなたが必要とするkのどんな値より

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 

ループ:あなたは簡単にこの(取引所、hereファイルのMatlabから適応)をachiveできnchoosekを使用

+0

ありがとう、Tokkot!これは本当に素晴らしく簡単な解決策です。 –

0

多変量多項式回帰のFileExchangeサブミットを確認してください。内部では、ある程度、任意の次数を持つ基底多項式のすべての単項式を計算します。稲妻は高速ですが、メモリを犠牲にしています。唯一の多項式の変数の数に、電源に依存し、ループのための明示的な存在しないこと

% 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 

お知らせ:

MultiPolyRegress

これは、関連するセクションです。また、潜在的に巨大な行列Aに注意してください。これを一見してからさらに助けが必要な場合はお知らせください。

関連する問題