|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre à l'essai
![]() Éric Ingénierie en automatisation et systèmes intelligents Inscription : septembre 2008 Messages : 40 ![]() |
Bonjour,
Je cherche à rendre plus rapide deux trucs. Premièrement, j'aimerais pouvoir générer aussi rapidement que possible un nombre aléatoire X entier de 1 à M excluant N. Présentement, je le fais ainsi : Code :
Deuxièmement, un autre cas un peu plus important. J'ai des N valeurs et je leur attribue une probabilité d'être choisie à l'aide de la relation N_i / sum(N_i). J'aimerais choisir à nouveau N valeurs, mais cette fois selon les probabilités. Donc, une valeur pourrait ne pas être choisie et une autre pourrait être choisie plusieurs fois, selon sa probabilité, en autant que la longueur finale des valeurs choisies est N. Exemple : La somme est 30, les probabilités sont : Le vecteur résultant pourrait être : Merci. PS : Je posterai mon algorithme pour ce cas prochainement. Dans mon algorithme, c'est mon utilisation de repmat qui pose problème. |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Florent Ing. Aérospatiale Inscription : juin 2003 Messages : 583 ![]() |
Pour le second problème, je te propose la fonction toto :
Code :
|
||
|
|
00
|
|
|
#3 | |
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 5 192 ![]() |
Bonsoir,
Pour le premier, randi serait je pense utile. Pour le deuxième, si tu as la Communications System Toolbox, tu peux utiliser la fonction randsrc.
__________________
Débutant en MATLAB ? Vous voulez faire une Interface Graphique ? Les Tutoriels et la FAQ sont là pour vous aider ![]() Une erreur ? "Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).Citation:
|
|
|
|
00
|
|
|
#4 | ||||||
|
Membre à l'essai
![]() Éric Ingénierie en automatisation et systèmes intelligents Inscription : septembre 2008 Messages : 40 ![]() |
Merci FLB pour la proposition. Malheureusement, j'avais oublié de mentionner que mon cas réel implique un vecteur de longueur variable qui pourrait même avoir une longueur de 100 éléments, voire plus.
Merci Winjerome pour l'information, je ne connaissais pas randsrc. Malheureusement, cette fonction n'est pas optimisée pour mon cas. Elle est fonctionnelle, mais elle est plus lourde qu'elle ne le paraît. Effectivement, comme pour l'utilisation de randi, il faut parfois évaluer les performances de certains outils et fonctions que MATLAB nous propose lorsqu'on veut optimiser en vitesse. MATLAB est un outil extrêmement puissant pour l'utilisation de matrices, mais on doit éviter autant que possible les boucles for. Aussi, certaines fonctions MATLAB possèdent tellement d'options et de vérifications qu'elles peuvent devenir lourdes. Toutes ces options les obligent parfois à passer par des boucles for. D'ailleurs, je viens déjà d'analyser l'utilisation de la fonction repmat et je préfère utiliser un produit matriciel. Voici quelques petits exemples de ce que j'avance : Code :
Code :
Voici ce que j'ai comme algorithme jusqu'à maintenant : Code :
Merci de votre aide, Éric |
||||||
|
|
00
|
|
|
#5 |
|
Membre à l'essai
![]() Éric Ingénierie en automatisation et systèmes intelligents Inscription : septembre 2008 Messages : 40 ![]() |
Pour le premier, je viens de trouver une meilleure façon qui me permet de diminuer le temps par un facteur 4 ou plus. Au lieu d'une moyenne de 4e-6 seconde par itération, j'ai une moyenne de 1e-6 seconde par itération.
Voici l'astuce toute bête : |
|
|
00
|
|
|
#6 | ||||
|
Membre Expert
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 876 ![]() |
Salut,
je trouve que la force brute est plus rapide : Code :
Si la vitesse est critique, pourquoi ne pas pré-calculer tes nombres aléatoires ? C'est à peu près aussi rapide et, surtout, ce temps de calcul peut être externalisé (mis hors de ta section critique). Code :
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais) Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>> |
||||
|
|
00
|
|
|
#7 |
|
Membre à l'essai
![]() Éric Ingénierie en automatisation et systèmes intelligents Inscription : septembre 2008 Messages : 40 ![]() |
Merci pour la proposition.
J'aurais probablement dû expliquer mon cas réel afin d'illustrer tous les petits détails qui pourraient accrocher dans une manipulation matricielle. Je dois en fait modifier les valeurs de plusieurs vecteurs de longueur N. Dans mon cas réel, N ne depasse pas 101, mais on pourrait aller jusqu'à 501 selon la limite que j'ai jugée pour mon code. Disons que tous les M vecteurs de longueur N contiennent des valeurs entières aléatoires. La borne inférieure de chacune des valeurs des vecteurs est 1 tandis que les bornes supérieures pour chacune des valeurs sont données par les éléments du vecteur C contenant donc N bornes. Je veux modifier aléatoirement chacune des valeurs de chacun des vecteurs en respectant lleurs bornes supérieures et en ne reprenant pas la même valeur. J'espère être clair, sinon je m'expliquerai mieux dès que j'aurai du temps et que je serai sur un ordinateur. Merci, Éric -------------------------------------------------------------------------- PS : Dans mon astuce toute bête, N peut être un vecteur de données et M un vecteur de bornes supérieures et le vecteur X retourné sera valable. X = mod(N+ceil(rand()*(M-1))-1,M)+1; |
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 876 ![]() |
en effet je ne comprend pas tout
![]()
disons quelque chose qui s'inspire de ça : Code :
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais) Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>> |
||
|
|
00
|
|
|
#9 |
|
Membre à l'essai
![]() Éric Ingénierie en automatisation et systèmes intelligents Inscription : septembre 2008 Messages : 40 ![]() |
Bon, j'ai maintenant un ordinateur, alors je m'explique et en même temps j'apporte quelques remarques et détails de plus.
Premièrement, le problème de la "force brute" de ta proposition est qu'elle est probabiliste. Je parlais dans mon exemple d'un nombre borné par [1,100] généré aléatoirement différent de 25. Il n'y a donc que 1% de chances de retomber sur ce même nombre. Cependant, si mon exemple était plutôt avec un nombre borné par [1,3] et différent de 2, alors il y aurait 33% de chances de retomber sur ce même nombre. Bon, oublions tous les noms de variables mentionnés précédemment. J'ai des vecteurs de longueur numel(N), soient N, NMAX et X. Par exemple : N = [2,3,1,2,4] et NMAX = [2,5,1,3,8]Je veux obtenir un vecteur X de valeurs entières aléatoires tel que ses valeurs ne dépassent pas les valeurs NMAX correspondantes (element-wise) et soient différentes des valeurs correspondantes de N. Une des valeurs maximales est 1, c'est le seul cas où la valeur aléatoire sera reprise puisqu'il n'y a qu'une seule possibilité : 1. Bref X <= NMAX et X(NMAX ~= 1) ~= N. Nous aurions par exemple, une réponse possible pour ce cas : Maintenant, il faut faire en sorte que pour un cas où numel(N) est très grand (par exemple 101) et qu'on doit répéter cet exercice un grand nombre de fois (par exemple 1e6 fois), le temps soit minimal. Merci, Éric |
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 876 ![]() |
sans spécialement chercher la performance, c'est comme ça que je ferais.
après, si tu veux vraiment aller vite, il te reste le C dans un mex-file. Code :
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais) Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>> |
||
|
|
00
|
|
|
#11 | ||
![]() ![]() Florent Ing. Aérospatiale Inscription : juin 2003 Messages : 583 ![]() |
Une meilleur solution concernant le second problème :
Code :
|
||
|
|
00
|
|
|
#12 |
|
Membre à l'essai
![]() Éric Ingénierie en automatisation et systèmes intelligents Inscription : septembre 2008 Messages : 40 ![]() |
Bonjour,
Je n'ai pas pu tester cette proposition, mais est-ce que le vecteur renvoyé est de meme longueur ? J'ai un vecteur d'une certaine longueur contenant des valeurs auxquelles je calcule les probabilités correspondantes et je veux obtenir un vecteur de même longueur contenant des valeurs choisies selon les probabilités. Merci, Éric |
|
|
00
|
|
|
#13 | ||
![]() ![]() Florent Ing. Aérospatiale Inscription : juin 2003 Messages : 583 ![]() |
Code :
Il est peut être possible de vectoriser tout ça, mais le code va commencer à devenir illisible... |
||
|
|
00
|
|
|
#14 | ||
|
Membre à l'essai
![]() Éric Ingénierie en automatisation et systèmes intelligents Inscription : septembre 2008 Messages : 40 ![]() |
Bonjour,
Merci pour vos suggestions. Malheureusement, je ne peux les tester actuellement puisque mon MATLAB roule un code pendant 2x 5h. J'ai fait ce bout de code pour comparer. J'espère ne pas avoir fait d'erreur dans mon template puisque je l'ai fait dans le Bloc-Notes. Code :
Éric PS : S'il y a un problème avec ce code ou si ma solution donne des solutions invalides, je vous reviens là-dessus plus tard parce que je sais que c'est normalement fonctionnel. |
||
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Olivier PlanchonChercheur Inscription : avril 2007 Messages : 876 ![]() |
quand je dois faire toutner matlab pendant des heures, je compile le code et je le fais tourner à côté. Comme ça j'ai toujours Matlab dispo pour travailler sur la prochaine étape.
__________________
Quelle que soit sa maigreur, les couilles de l'éléphant rempliront une marmite (proverbe gabonais) Matlab 7.12.0.635 (R2011a), Ubuntu 12.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>> |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com