%	Copyright 2005-2009 José Luis Crespo. Universidad de Cantabria
function [obser,predic,lote]=prepmatopt(matvel,orden,paso,antici)
%Funcion que prepara secuencias para velocidades complejas
%DATOS
%	secuencias complejas de velocidades de puntos
%	orden pedido
%   paso
%   anticipación de la predicción
%RESULTADO
%	matriz de observaciones (van reales e imaginarios separados)
%   vector de predicciones (complejos)

%Partimos de que para condicionar los coeficientes basta un orden de magnitud mayor
% El número de coeficientes es (para cada componente de la velocidad) de orden+1
%Entonces el número de filas necesarias es 10(orden+1)=neces
%El que se puede conseguir es lote*numsecuencias
%para que estén todas representadas se divide entre ellas necsec=neces/numsecuencias
%para que la representación sea más útil, se cogen las del final
%si se quiere esto, activar las líneas %L

tam=size(matvel);
%Un punto en cada fila y un instante en cada columna
nuins=tam(2);
%el orden temporal aritmético máximo es tal que quitando la anticipacion
%quepan orden-1 intervalos de paso
ordentmax=(nuins-1-antici)/paso+1;
if orden <= ordentmax
 %índices a considerar orden:nuins-1, orden-1:nuins-2, ..., 1:nuins-orden
 %Las predicciones: respuestas reales van a quedar en primer lugar
 %Como van reales e imaginarios se saca la real como 1 y la imaginaria como
 % mitad de número de columnas más 1
 %Las anteriores están justo en la columna siguiente, para orden mayor que
 %1
  indbase=(orden-1)*paso+1:nuins-antici;
 indices=repmat(indbase,orden,1);
 resta=0:orden-1;
 lote=nuins-antici-(orden-1)*paso;
 matresta=repmat(resta',1,lote);%primera fila es 0, segunda es 1, etc.
 indices=indices-(paso*matresta);%primera fila: (orden-1)*paso+1, (orden-1)*paso+2, ...,max-antici; segunda: (orden-2)*paso+1,(orden-2)*paso+2,...,max-antici-paso
 indices=indices';%primera fila:(orden-1)*paso+1,(orden-2)*paso+1,...,1; segunda: (orden-1)*paso+2, (orden-2)*paso+2, ...,2;ultima:max-antici,max-antici-paso,...
 %Las más recientes son las últimas filas
%L neces=10*(orden+1);
 %Lnecsec=ceil(neces/tam(1));
%L if necsec>lote
%L  disp('10 veces más es demasiado');
%L  else
%L  indnec=indices(end-necsec+1:end,:);
indnec=indices;
tamind=size(indnec);
 filbase=1:tam(1);
 seg=repmat(filbase,[tamind(1),1,tamind(2)]);
 filas=reshape(seg,tam(1)*tamind(1),tamind(2));
 cols=repmat(indnec,tam(1),1);
 inds=sub2ind(tam,filas,cols);
          obs=matvel(inds);
 obser=[real(obs),imag(obs)];
 predic=conv2(matvel(:,indbase(1)+1:indbase(end)+antici),ones(1,antici),'valid');
 %valen las últimas
%L predic=predic(:,end-necsec+1:end);
 predic=predic.';
 predic=reshape(predic,tam(1)*tamind(1),1);
%L end
else
    disp('Orden pedido mayor que el posible');
end

