Page 1 sur 1

[Matlab] Affiner le pas d'un vecteur sans boucle ?

MessagePosté: Lundi 25 Avril 2016, 09:26
par Maxinquaye
Bonjour,

J'ai le vecteur S = [S1, S2, S3, S4, S5], de taille variable (qui change selon les paramètres d’exécution de mon programme) dont les valeurs ne sont pas espacées linéairement (disons qu'elles sont aléatoires) et j'aimerai créé le vecteur V tel que :

V = [S1-x*pas, S1-(x-1)*pas, S1-(x-2)*pas, ... S1+x*pas, S2-x*pas, ... S2+x*pas, ... S5+x*pas].

Pour être un peu plus clair voici un petit exemple numérique :

Si S = [3 12 7], je voudrais (par exemple) que V = [3-2/10, 3-1/10, 3, 3+1/10, 3+2/10, 12-2/10, 12-1/10, 12, 12+1/10, 12+2/10, 7-2/10, 7-1/10, 7, 7+1/10, 7+2/10].

Actuellement, j'utilise une boucle pour remplir mon vecteur V de la manière suivante :

Code: Tout sélectionner
 V = S(1)-x*pas : pas : S(1)+x*pas;

for a = 2 : length(S)

V = [V S(a)-x*pas : pas : S(a)+x*pas];

end


Le problème, c'est que la taille de S peut être très conséquente (par exemple 10^4 points), et que je souhaite optimiser au maximum la vitesse d’exécution de mon programme, et donc supprimer la boucle.

Je voulais donc savoir s'il existait dans Matlab (puisque je suppose que c'est le cas) une fonction permettant d'affiner le pas d'un vecteur (le vecteur S) contenant déjà des valeurs connues et qui ne sont pas forcément espacées linéairement.

J'ai recherché par moi même la solution en essayant différents algorithmes, puis sur internet et je n'ai rien trouvé (à vrai dire, je ne sais pas vraiment comment l'opération que j'essaie de réaliser s'appelle et donc je tape surement des mots clefs trop vagues ...).

Si jamais quelqu'un connait une fonction qui est déjà implémentée dans Matlab permettant d'obtenir mon vecteur V à partir du vecteur S ou a l'idée d'un algorithme (sans boucle !!!) pour arriver à ce résultat je suis preneur !

Maxinquaye

Re: [Matlab] Affiner le pas d'un vecteur sans boucle ?

MessagePosté: Lundi 25 Avril 2016, 20:46
par guiguiche
D'après ce que j'ai pu tester dans Scilab (je n'ai jamais utilisé Matlab), l'allocation mémoire est peu efficace quand on veut agrandir la taille d'une tableau. Il faudrait initialiser la matrice V à la bonne taille et gérer une double boucle. Pour faire plus simple en terme de programmation j'ai testé ça qui me semble fonctionnel (sous Scilab) :
Code: Tout sélectionner
S=[1,2,4] ; n=length(S)
pas=0.5 ; x=2 ; m=2*x+1
T=zeros(m,n)
for i=1:n
    T(:,i)=[S(i)-x*pas:pas:S(i)+x*pas]'
end
V=zeros(1,n*m)
for i=1:n*m
    V(i)=T(i)
end
disp(T)
disp(V)

Par contre, ça double la taille mémoire utilisée, ce n'est pas terrible.

Re: [Matlab] Affiner le pas d'un vecteur sans boucle ?

MessagePosté: Lundi 25 Avril 2016, 20:54
par guiguiche
C'est peut-être mieux :
Code: Tout sélectionner
S=[1,2,4] ; n=length(S)
pas=0.5 ; x=2 ; m=2*x+1
V=zeros(1,n*m)
for i=1:n
    V(1+(i-1)*m:m+(i-1)*m)=[S(i)-x*pas:pas:S(i)+x*pas]
end
disp(V)

Re: [Matlab] Affiner le pas d'un vecteur sans boucle ?

MessagePosté: Lundi 25 Avril 2016, 21:24
par OG
Bonsoir

Et le produit de Kronecker !
Code: Tout sélectionner
S.*.ones(1,2*x+1)+ones(1,length(S)).*.([0:2*x]-x)*pas


O.G.

Re: [Matlab] Affiner le pas d'un vecteur sans boucle ?

MessagePosté: Mardi 26 Avril 2016, 09:42
par Maxinquaye
Merci beaucoup pour vos deux réponses !

Il est vrai que j'aurai pu définir la taille de mon vecteur auparavant pour gagner un peu de temps, mais le problème reste principalement l'utilisation de boucles qui augmentent considérablement les temps de calcul de Matlab, ceci dit il est vrai que ça ne coute rien d'optimiser au maximum, j'aurai pu être plus rigoureux !

OG a écrit:Bonsoir

Et le produit de Kronecker !
Code: Tout sélectionner
S.*.ones(1,2*x+1)+ones(1,length(S)).*.([0:2*x]-x)*pas


O.G.


Merci beaucoup, c'est exactement ce que je cherchais ! Cumulé à la fonction reshape, j'obtiens effectivement le vecteur voulu.