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

Tout ce qui concerne les différents logiciels mathématiques (Matlab, Maxima, Scilab, R, Maple, Mathematica, ...) et les calculatrices scientifiques.
Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.
> Préciser le nom du logiciel concerné dans le titre de votre message.

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

Messagepar Maxinquaye » Lundi 25 Avril 2016, 09:26

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
Maxinquaye
Déca-utilisateur
 
Messages: 17
Inscription: Lundi 22 Avril 2013, 18:02
Localisation: Valenciennes
Statut actuel: Post-bac | Doctorat

Publicité

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

Messagepar guiguiche » Lundi 25 Avril 2016, 20:46

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
 
Messages: 8019
Inscription: Vendredi 06 Janvier 2006, 15:32
Localisation: Le Mans
Statut actuel: Actif et salarié | Enseignant

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

Messagepar guiguiche » Lundi 25 Avril 2016, 20:54

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.
guiguiche
Modérateur
 
Messages: 8019
Inscription: Vendredi 06 Janvier 2006, 15:32
Localisation: Le Mans
Statut actuel: Actif et salarié | Enseignant

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

Messagepar OG » Lundi 25 Avril 2016, 21:24

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.
OG
Modérateur
 
Messages: 2210
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

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

Messagepar Maxinquaye » Mardi 26 Avril 2016, 09:42

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.
Maxinquaye
Déca-utilisateur
 
Messages: 17
Inscription: Lundi 22 Avril 2013, 18:02
Localisation: Valenciennes
Statut actuel: Post-bac | Doctorat


Retourner vers Logiciels mathématiques

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité