ITE / code / shared / MA_polynomial.m

Full commit
function [H] = MA_polynomial(Dx,De,MAparameters)
%Generates a MA polynomial H[z] of dimension Dx x De (H[z]\in R[z]^{Dx x De}) and length L, to an uMA-IPA/complete MA-IPA problem.
%   MAparameters.type: 
%      1)'randn' ('rand'): the coordinates of H are i.i.d. standard normal (uniform = U[0,1]) variables.
%      2)'stable': H corresponds to the polynomail matrix H[z] = [\prod_{k=1}^L(I-lambda O_i z^{-1})]H_0: O_i,H_0:random orthogonal, |MAparameters.lambda|<1.
%   MAparameters.L: length of the convolution; H_0,...,H_{L}: L+1 H_j matrices.
%   H = [H_0,...,H_L], where H[z] = \sum_{l=0}^L H_l z^{-l}.
%   %uMA-IPA:
%      MAparameters.type = 'randn';
%      H = MA_polynomial(4,2,3,MAparameters);
%   %MA-IPA:
%       MAparameters.type = 'stable';
%       MAparameters.lambda = 0.4;
%       H = MA_polynomial(4,2,3,MAparameters);
%Copyright (C) 2012 Zoltan Szabo ("", "szzoli (at) cs (dot) elte (dot) hu")
%This file is part of the ITE (Information Theoretical Estimators) Matlab/Octave toolbox.
%ITE is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
%the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
%This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
%You should have received a copy of the GNU General Public License along with ITE. If not, see <>.

switch MAparameters.type
    case 'randn'%uMA-IPA
        H = randn(Dx,De*(MAparameters.L+1));
    case 'rand'%uMA-IPA
        H = rand(Dx,De*(MAparameters.L+1));  
    case 'stable'%MA-IPA (Dx=De)
        if Dx==De
            MA_L = MAparameters.L;
            MA_lambda = MAparameters.lambda;
            %Hz = [\prod_{k=1}^L(I-lambda O_i z^{-1})]: O_i:random orthogonal.
                Hz = {eye(De)};            
                for k = 1 : MA_L
                    Hznew = {};
                    Hznew{1}= eye(De);
                    Hznew{2} = -MA_lambda * random_orthogonal(De);
                    Hz = multiply_polynomial_matrices(Hz,Hznew);
            %xH0, H_0: orthogonal.
                H0 = random_orthogonal(De);
                H = zeros(De,De*(MA_L+1));%preallocation
                for k = 1 : length(Hz)
                    H(:,(k-1)*De+1:k*De) = Hz{k} * H0;
            error('dim(x) must be equal to dim(e), i.e., we are focusing on complete systems!');
        error('MA type=?');