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

Tout ce qui concerne les logiciels mathématiques (Matlab, Maxima, Scilab, R, ...) et les calculatrices scientifiques.
[forum modéré par les modérateurs globaux du site]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
Maxinquaye
Utilisateur confirmé
Utilisateur confirmé
Messages : 17
Inscription : lundi 22 avril 2013, 19:02
Localisation : Valenciennes

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

Message 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

guiguiche
Modérateur global
Modérateur global
Messages : 8074
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

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

Message 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.
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.

guiguiche
Modérateur global
Modérateur global
Messages : 8074
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

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

Message 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)
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

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

Message 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.

Maxinquaye
Utilisateur confirmé
Utilisateur confirmé
Messages : 17
Inscription : lundi 22 avril 2013, 19:02
Localisation : Valenciennes

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

Message 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.