function Ustar = ppp_ustar (A_u,n_u,tau,order,packed,n_zero)
## usage: Us = ppp_ustar(A_u,n_u,tau,order,packed)
##
## Computes the U* matrix at time tau in terms of A_u
## n_u : Number of system inputs
## If tau is a vector, computes U* at each tau and puts into a row vector:
## If packed==1
## Ustar = [Ustar(tau_1) Ustar(tau_2) ...]
## else Ustar = [Ustar(tau_1); Ustar(tau_2) ...]
## n_zero extra zero columns appended
## Copyright (C) 1999 by Peter J. Gawthrop
## $Id$
if nargin<2
n_u = 1;
endif
if nargin<3
tau = 0;
endif
if nargin<4
order = 0;
endif
if nargin<5
packed=1;
endif
if nargin<6
n_zero=0;
endif
[n,m] = size(A_u); # Size of composite A_u matrix
N = m; # Number of U* functions per input
nm = n/m;
if (nm != n_u)&&(n!=m) # Check consistency
error("A_u must be square or be a column of square matrices");
endif
u_0 = ones(N,1);
Ustar = [];
for t = tau;
ustar = [];
for i = 1:n_u
A_i = ppp_extract(A_u,i);
Ak = A_i^order;
eA = expm(A_i*t);
if (packed==1)
ustar = [ustar; zeros(1,(i-1)*N), (Ak*eA*u_0)', \
zeros(1,(n_u-i)*N)];
else
ustar = [ustar, (Ak*eA*u_0)'];
endif
endfor
if (packed==1)
Ustar = [Ustar ustar];
else
Ustar = [Ustar; ustar];
endif
endfor
if (n_zero>0)
[N,M] = size(Ustar);
Ustar = [Ustar zeros(N, n_zero)];
endif
endfunction