Dans Matlab, comment générer des nombres aléatoires en fonction des données?

StackOverflow https://stackoverflow.com/questions/4352604

  •  08-10-2019
  •  | 
  •  

Question

Par exemple, si Ax = 0.0023, il faut ajouter un peu de bruit et produits newAx = 0.0027 Si Hy = 94.54, newHy = 93.42 alors. Au départ, je commencé à utiliser rand en Matlab de la manière suivante,

newAx = Ax + rand
newAx = 0.9453

Ceci est très loin du paramètre Ax(0.0023) que j'ai.

Si je dois plage d'utilisation alors dans ce cas nous devons utiliser min et max d'Ax. Cela présente aussi des sujets comme il est loin des valeurs. Comme je l'ai un système où Ax est un paramètre progressivement de plus en plus à chaque instant du temps. Maintenant, à chaque instant en fonction de la valeur d'Ax je dois générer un bruit aléatoire pour obtenir newAx qui est presque proche de Ax. Exemple si Ax = 0.0023 générer newAx = 0.0027 et non newAx = 0.4590

Je dois créer un bruit aléatoire qui dépend des données elles-mêmes.

Était-ce utile?

La solution

Quel genre de « bruit » que vous essayez de simuler?

rand (1) vous donne un nombre aléatoire uniforme dans la plage 0 de distribution normale, où des valeurs proches de le centre sont plus susceptibles que les valeurs loin du centre.

Matlab supports (randn) pour la distribution normale.

D'autres distributions qui modèles d'autres systèmes peuvent être obtenus à partir des nombres aléatoires uniformes.

Autres conseils

Une façon de faire est d'utiliser randn pour générer normalement distribués valeurs de bruit, puis adaptent l'écart type du bruit à un pourcentage de la valeur de données:

noiseScale = 0.05;  %# Noise with a standard deviation of %5 of the data
newAx = Ax + noiseScale*Ax*randn;

Et si Ax est vecteur des valeurs que vous voulez ajouter du bruit, vous pouvez faire ceci:

newAx = Ax + noiseScale.*Ax.*randn(size(Ax));

Si vous voulez vous assurer que les séjours newAx dans une plage de valeurs, vous pouvez utiliser les fonctions MAX et MIN comme ceci:

newAx = min(newAx,maxValue);  %# Clip newAx to a maximum of maxValue
newAx = max(newAx,minValue);  %# Clip newAx to a minimum of minValue
newDatum = oldDatum+2*(rand(1)-0.5)*oldDatum
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top