0001 function dec = addMonomialMatrixDec(dec, nMax)
0002
0003
0004 mat = cell(nMax, 1);
0005
0006 nMonomial = 0;
0007
0008 for iExpo = 1:nMax
0009
0010 mat{iExpo} = obtainOrderedSetMatrix(dec.nC, iExpo, 1);
0011 nRow = size(mat{iExpo}, 1);
0012 nMonomial = nMonomial + nRow;
0013
0014
0015
0016
0017
0018
0019
0020 end
0021
0022 nMonomial = nMonomial + 1;
0023 dec.monomialMatrix = zeros(nMonomial, nMax);
0024 iRow = 0;
0025 for iExpo = nMax:-1:1
0026 dec.monomialMatrix(iRow + (1:size(mat{iExpo}, 1)), 1:iExpo) = mat{iExpo};
0027 iRow = iRow + size(mat{iExpo}, 1);
0028 end
0029
0030
0031
0032
0033
0034 matIndex = zeros(nMonomial, nMonomial);
0035 matFactor = zeros(nMonomial, nMonomial);
0036
0037 for iExpo = 1:nMax
0038
0039 derivativeMonomialMatrix = dec.monomialMatrix(:, ...
0040 [(1:(iExpo-1)) ((iExpo+1):end)]);
0041
0042
0043 derivativeMonomialMatrix = [derivativeMonomialMatrix zeros(nMonomial, 1)];
0044
0045
0046
0047 colVector = zeros(nMonomial, 1);
0048 for iMono = 1:nMonomial
0049 filterMatrix = bsxfun(@eq, dec.monomialMatrix, ...
0050 derivativeMonomialMatrix(iMono, :));
0051 filterVector = sum(filterMatrix, 2) >= size(dec.monomialMatrix, 2);
0052 if sum(filterVector) > 1 || ~any(filterVector)
0053 error('elk:decMonomial:internalError', ['The construction of the ' ...
0054 'monomial derivatives failed. The partial derivative should ' ...
0055 'be unique in the monomialMatrix but is not. This should not ' ...
0056 'happen.']);
0057 end
0058 colVector(iMono) = find(filterVector);
0059 end
0060
0061 rowVector = (1:nMonomial)';
0062
0063
0064
0065 thisFilter = dec.monomialMatrix(:, iExpo) == 0;
0066 colVector(thisFilter) = [];
0067 rowVector(thisFilter) = [];
0068
0069
0070 matIndexVector = sub2ind(size(matIndex), rowVector, colVector);
0071
0072
0073
0074 matIndex(matIndexVector) = dec.monomialMatrix(~thisFilter, iExpo);
0075
0076
0077 matFactor(matIndexVector) = matFactor(matIndexVector) + 1;
0078 end
0079
0080 dec.monomialDerivativeIndexMatrix = matIndex;
0081 dec.monomialDerivativeFactorMatrix = matFactor;