MATLAB: comment ignorer des valeurs ou définir NaN tout en conservant la même taille de matrice

J’ai une matrice de 2400 x 2400, ‘alb_short’, avec des valeurs allant de 1-100, mais avec de nombreuses valeurs aberrantes de plus de 100 qui doivent être ignorées afin que je puisse tracer les résultats.
Comment puis-je ignorer ces grandes valeurs ou les définir sur NaN pour que ma matrice reste à sa taille d’origine 2400 × 2400?
Je vous remercie.

Meilleure réponse

  •  

    A(A>100)=nan

     

  • MATLAB: comment substituer des cellules NaN dans une colonne (de matrice) avec le nombre valide précédent

    Salut les gars, question assez facile je suppose…
    J’ai une très grande matrice pleine de valeurs NaN, des milliers dans chaque colonne. Je dois les remplacer par la première valeur la plus ancienne disponible ..
    Disons que j’ai une colonne comme celle-ci:
    1
    2
    4
    NaN
    2
    Dans ce cas, je devrais remplacer NaN par 2. J’ai quelques complexités, par exemple je n’ai peut-être pas de matrice rectangulaire et je pourrais avoir quelques nan à la fin de la colonne… dans ce cas je devrais remplacer le nan par la première valeur  » up « .. Exemple:
    1
    3
    2
    NaN
    NaN
    Dans ce cas, le NaN doit devenir les deux 2.
    Je joins un exemple d’un petit fichier .mat prêt à faire quelques essais.
    Merci beaucoup pour l’aide.

    Meilleure réponse

  • C’est le moyen le plus rapide que j’ai pu trouver. Pas très élégant ou probablement le moyen le plus optimal mais le voici. Je commencerais par trouver la dernière valeur non NaN et la remplacer par la dernière entrée de la colonne. Cela garantit que la toute dernière entrée est un nombre. Remplace ensuite chaque valeur NaN par le numéro suivant jusqu’à ce qu’il ne reste plus de valeurs NaN dans cette colonne. Passe ensuite à la colonne suivante.
     

    iexample = Example;
    for i =1:4
    temp = iexample(:,i);
    A = isnan(temp);
    A = find(A==0);
    temp(end) = temp(A(end));
    while sum(isnan(temp))~=0
    B = isnan(temp);
    B = find(B==1);
    temp(B)=temp(B+1);
    end
    iexample(:,i)=temp;
    end

     

  • MATLAB: fractionner le vecteur en groupes de données et tracer le meilleur ajustement

    Bonsoir,
    J’ai un groupe de données au format suivant:
     
    Dat = [ NaN ; NaN ; 23 ; 34 ; 5 ; 12 ; 4 ; 123 ; NaN ; NaN ; Nan ; 23 ; 4 ; 1 ; 4 ; 21 ; Nan ; 234 ; 12 ; 3 ; 12 ; NaN ; 342 ; 32 ; NaN ; NaN ; NaN ; NaN ; 34 ] ;
     
    Je voudrais prendre les groupes de valeurs entre les ensembles NaN et tracer l’équation de meilleur ajustement. Je prendrais donc:
    a = [23 34 5 12 4 123] b = [23 4 1 4 21] c = etc….
    et tracer une courbe de meilleur ajustement pour chacun d’eux.
    J’ai réussi à trouver un moyen d’utiliser des indices et une boucle for, mais c’est trop compliqué. Cela se traduit également par des bugs à venir comme nous l’avons vu avec mon professeur. Y a-t-il une façon de suggérer?
    KR,
    Kosta

    Meilleure réponse

  • Vous pouvez utiliser le code suivant pour diviser le vecteur en groupes de données:
     
    Dat = [ NaN ; NaN ; 23 ; 34 ; 5 ; 12 ; 4 ; 123 ; NaN ; NaN ; NaN ; 23 ; 4 ; 1 ; 4 ; 21 ; NaN ; 234 ; 12 ; 3 ; 12 ; NaN ; 342 ; 32 ; NaN ; NaN ; NaN ; NaN ; 34 ] ;
    count = length(Dat);
    % get the indices of NaN elements
    nan_indices = find(isnan(Dat));
    groups = [];
    % pick the elements between NaN elements
    for i = 1:length(nan_indices) - 1
    % range to pick the elements
    first = nan_indices(i) + 1;
    last = nan_indices(i+1) - 1;
    % pick only if there is atleast one element between NaN values
    if( last > first)
    groups = [groups {Dat(first:last)}];
    end
    end
    last_nan = nan_indices(end);
    % add elements that are after the last NaN
    if(count > last_nan)
    groups = [groups {Dat(last_nan+1:end)}]
    end
     
    Les « groupes » auront des blocs de données entre les NaN. Dans ce cas, il aura 5 tableaux de cellules. Vous pouvez y accéder et utiliser comme suit:
     

    a = groups{1}
    b = groups{2} and so on..

     

  • MATLAB: Comment faire l’interpolation

    Salut à tous,
    J’ai travaillé avec la série chronologique des données sur le niveau de la mer (résidu non marémoteur. Il n’y a donc pas de périodicité dans la série chronologique. Pourriez-vous s’il vous plaît m’aider à faire une interpolation car elle contient des valeurs de NaN.
    Merci d’avance.

    Meilleure réponse

  • Un peu plus d’explications sur ce que vous essayez de faire est nécessaire ici. Essayez-vous d’interpoler des données dispersées vers une grille régulière? Si c’est le cas, votre meilleure option est probablement de supprimer les NAN avant l’interpolation. Ou voulez-vous combler certains des points manquants dans un ensemble de données déjà maillé? Ou autre chose?
  • MATLAB: Comment récupérer des valeurs d’une autre matrice pour que je puisse faire un tracé de carquois

    J’ai écrit un programme qui lit les fichiers .nc à partir d’un dossier et met les vitesses de nom de fichier, longitude, latitude, u (composante est) et v (composante nord) dans une seule structure. Chacun d’eux a sa propre matrice mais ils sont liés. Pour un fichier dans l’espace de travail, il affiche:
    • Latitude = 140 × 1 simple
    • Longitude = 171 × 1 simple
    • u = 171 × 140
    • v = 171 × 140
    c’est donc presque comme un graphique, où la latitude est les valeurs x et la longitude sont les valeurs y. Le problème que j’ai est qu’il existe du NaN pour de nombreuses valeurs u et v. Je veux avoir une structure séparée avec des valeurs u et v qui ne sont pas NaN, et leurs valeurs respectives de longitude et de latitude. Je pensais que je passerais en revue tous les éléments et choisirais les entiers. Après cela, je dois savoir où il se trouvait dans la structure. De cette façon, je peux utiliser où c’était pour trouver où regarder dans la structure Latitude et Longitude. Par exemple, j’ai quelque chose comme ça dans une structure (nombres aléatoires): regardez le fichier txt joint.
    Je veux faire un tracé de carquois / vitesse, de sorte que les points correspondants ressembleraient à x, y, u, v = 20,34, -. 4, .7. Ces tracés ont beaucoup de points de données, mais je ne sais pas comment obtenir les longitudes et latitudes respectives des structures qui correspondent aux u et v pour les tracer. L’exemple ci-dessus montre comment je l’ai organisé dans mon code. Merci!

    Meilleure réponse

  • Soit x, y vos données de longitude et de latitude.
     

    [X,Y] = meshgrid(x,y) ;
    quiver(X,Y,u,v) ;

     

  • MATLAB: Comment écrire correctement ce script simple

    Salut j’ai
     
    s=[1 0 1;0 0 0];
    b=[2 3 4];
     
    J’aimerais avoir ceci comme résultat
     
    c=[nan 3 nan;2 3 4]
     
    Je veux dire remplacer 1 par nan et o par b.
     
    for r= 1:3
    s_ind = find(s(:,r) == 1);
    s(s_ind)=nan;
    m(:,r)=s
    a_ind = find(s(:,r) == 0);
    % I don't know how to replace for 0 from matrix b??
    end
     
    toute aide serait appréciée à l’avance.

    Meilleure réponse

  • En utilisant simplement l’indexation logique:
     

    >> s = [1,0,1;0,0,0];
    >> b = [2,3,4];
    >> out = repmat(b,size(s,1),1);
    >> out(s==1) = NaN
    out =
    NaN 3 NaN
    2 3 4

     

  • MATLAB: existe-t-il une solution de contournement pour éviter l’impression du NaN généré en raison de dtmc lors de l’utilisation de graphplot

    Salut,
    Je comprends que MATLAB normalise la matrice de transition de sorte que toutes les lignes soient égales à 1. Autrement dit, MATLAB calcule une matrice stochastique droite à partir de la matrice des transitions observées. Par conséquent, si j’ai une matrice de transition pour HMM qui a une ligne entière0,0 il est convertiNaNs.
    Techniquement, cela ne pose pas de problème tant que je n’utilise pas de graphique et que je souhaite afficher les valeurs des bords (sous l’image).
    Ma matrice de transition est comme ça (la première colonne et la dernière ligne sont entièrement à 0). En effet, la première colonne représente les états qui passent à l’état initial, qui est nul, et la dernière ligne est entièrement nulle car il n’y a pas de transition après l’état final.
    Je cherche essentiellement des moyens de contourner le masquage ou de ne pas afficher les NaN en premier lieu dans le graphique.
    J’ai pensé à supprimer la première colonne et la dernière ligne et à l’utiliser comme matrice de transition, mais cela rend la matrice de transition asymétrique (l’état de la première colonne et de la première ligne ne sera pas le même) et je ne peux pas travailler avec cela.
    J’apprécie vraiment tout type d’orientation.
    Merci.

    Meilleure réponse

  • La fonction graphplot ne prend pas en charge l’affichage des valeurs NaN. L’utilisation peut utiliser la fonction de tracé à la place, car le tracé de graphique est comme la fonction de tracé. Dans la fonction de tracé, vous pouvez interpoler pour remplir les valeurs manquantes.
    Vous pouvez vous référer à ce lien pour savoir comment contourner les valeurs NaN dans la fonction de tracé:https://www.mathworks.com/matlabcentral/answers/51857-how-do-we-plot-a-graph-with-non-available-values-for-y-without-breaking-the-continuity
  • MATLAB: Readmatrix produit des valeurs NaN après l’analyse d’un fichier .txt

    Salut les gars,
    J’ai rencontré des phénomènes étranges en travaillant avec readmatrix (). Je produis plusieurs fichiers .txt avec des données d’emphémérides dans un logiciel de propagation orbitale et je souhaite travailler plus loin sur les données de position et de vitesse dans Matlab. Le fait est qu’après avoir analysé ces fichiers .txt avec readmatrix (), je reçois des NaN étranges à des endroits aléatoires. Par exemple, pour votre commodité, je ne fournirai que matrixA avec le moins de NaN, mais il existe d’autres fichiers où le nombre atteint jusqu’à 221, ce qui après l’analyse donne 2 NaN (voir la section de code ci-dessous).
    La chose est, quand j’ai commencé à vérifier manuellement mes fichiers .txt, j’ai découvert queil n’y a pas de NaN dans les fichiers txt eux-mêmes. À la ligne / col id fourni par letrouver (isnan ())routine, je m’attendais à voir smth bizarre dans le fichier txt lui-même. Cependant, ce que je peux voir est un nombre raisonnable et attendu, donc le problème réside probablement dans la façon dont j’ai configuré la matrice de lecture elle-même. Pouvez-vous me donner une suggestion sur la façon de traiter ce problème de génération NaN? Je vais également joindre une matrice A.txt archivée pour votre commodité.
    Merci d’avance!
     
    matrixA=readmatrix('matrixA.txt');
    [row,col]=find(isnan(matrixA))
    row =
    45636
    19918
    col =
    3
    4
     

    Meilleure réponse

  • Voir cette solution
    Je n’ai pasmatrice de lecture. j’ai essayéimporter des données
     
    A = importdata('matrixA.txt');
    data = A.data;
    find( isnan(data(:)) )
     
    résultat
     

    ans =
    Empty matrix: 0-by-1

     

  • MATLAB: moyenne tous les 5 éléments d’une matrice pour chaque colonne avec Nans

    J’ai une matrice de 2241 × 6914 et j’espérais faire la moyenne tous les 5 éléments de chaque colonne de sorte que la matrice finale soit 448 × 6914. Le problème est qu’il existe des emplacements dans lesquels les Nans apparaissent dans les données et je ne veux pas que ceux-ci affectent cette moyenne. J’ai essayé le code ci-dessous et cela fonctionne généralement, mais je suis curieux de savoir s’il existe un moyen de ne pas faire en sorte qu’un Nan par défaut la moyenne des 5 éléments à NaN. Ce que je veux dire par là, c’est que si les valeurs [1,2,3, Nan, 4] étaient moyennées, la valeur retournerait Nan par opposition aux 2,5 que je voudrais. Y a-t-il des moyens de contourner cela? Je noterai également que je ne suis pas sûr que ce n’est pas le moyen le plus efficace de coder cela, mais c’était juste le moyen le plus simple à mes yeux. Toute aide serait appréciée!
     
    Ch3StrainAvg(1,:)=ChtrainData(1,:);
    endCondition=size(Ch3StrainData,1)-4
    n=2
    for j=2:5:endCondition
    Ch3StrainAvg(n,:)=((Ch3StrainData(j,:)+Ch3StrainData(j+1,:)+Ch3StrainData(j+2,:)+Ch3StrainData(j+3,:)+Ch3StrainData(j+4,:))/5);
    n=n+1;
    end
     

    Meilleure réponse

  • Pourx = [1 2 3 NaN 4], comme votre court exemple, vous pouvez le faire pour ignorer les NaN dans la moyenne:
     

    mean(x(~isnan(x)))

     

  • MATLAB: moyenne des valeurs dans une matrice avec Nans

    J’ai récemment posté quelque chose de similaire hier et j’ai pensé que je ne l’ai compris que pour réaliser que ma sortie n’était pas correcte. Im essayant de faire la moyenne toutes les 2 valeurs dans une colonne de telle sorte qu’une matrice 20 x 7 devient une matrice 10 × 7 de valeurs moyennes. J’ai écrit le code ci-dessous avec une matrice arbitraire de 20 x 7 en tant que testeur, mais cela ne renvoie qu’une matrice de réponses qui sont toutes les mêmes. Ce code ci-dessous utilisant la matrice fournie par exemple renvoie une matrice 10 × 7 de -1. Y a-t-il un moyen de contourner cela?
    Edit: Je sais que cet échantillon n’a qu’une valeur « nan », mais les applications futures de celui-ci pourraient en avoir beaucoup plus!
     
    Strain=[-1,0,2,-1,-1,-1,-1;-1,1,1,1,nan,-1,-1;-1,2,2,1,-2,-2,-1;0,2,1,-1,-1,0,0;-1,1,3,-1,-2,0,-2;0,0,1,2,-1,0,-1;1,1,0,1,-1,1,-1;-1,2,1,1,-1,0,1;-2,-1,0,-1,-5,0,0;-2,1,0,1,0,0,-1;-2,1,2,1,0,-1,-1;1,1,2,0,-1,0,-2;0,3,0,2,-2,-1,-1;-2,2,1,-1,-2,0,0;-4,-1,-1,1,1,1,0;-1,2,3,1,-1,1,0;-1,1,1,1,-1,1,-1;-1,1,1,2,-1,1,0;-2,0,1,0,0,0,-1;0,2,2,1,-3,-2,-1]
    endCondition=20;
    for j=1:size(Strain,2)
    n=1
    for i=1:2:endCondition
    Test(n,j)=mean(Strain(~isnan(Strain(i:i+1,j))))
    n=n+1;
    end
    end
     

    Meilleure réponse

  •  
    Strain=[-1,0,2,-1,-1,-1,-1;-1,1,1,1,nan,-1,-1;-1,2,2,1,-2,-2,-1;0,2,1,-1,-1,0,0;-1,1,3,-1,-2,0,-2;0,0,1,2,-1,0,-1;1,1,0,1,-1,1,-1;-1,2,1,1,-1,0,1;-2,-1,0,-1,-5,0,0;-2,1,0,1,0,0,-1;-2,1,2,1,0,-1,-1;1,1,2,0,-1,0,-2;0,3,0,2,-2,-1,-1;-2,2,1,-1,-2,0,0;-4,-1,-1,1,1,1,0;-1,2,3,1,-1,1,0;-1,1,1,1,-1,1,-1;-1,1,1,2,-1,1,0;-2,0,1,0,0,0,-1;0,2,2,1,-3,-2,-1]
    M = zeros(10,7) ;
    [m,n] = size(Strain) ;
    count = 0 ;
    for i = 1:2:m
    count = count+1 ;
    M(count,:) = nanmean(Strain(i:i+1,:)) ;
    endfor
     
    Sans boucle:
     

    Strain=[-1,0,2,-1,-1,-1,-1;-1,1,1,1,nan,-1,-1;-1,2,2,1,-2,-2,-1;0,2,1,-1,-1,0,0;-1,1,3,-1,-2,0,-2;0,0,1,2,-1,0,-1;1,1,0,1,-1,1,-1;-1,2,1,1,-1,0,1;-2,-1,0,-1,-5,0,0;-2,1,0,1,0,0,-1;-2,1,2,1,0,-1,-1;1,1,2,0,-1,0,-2;0,3,0,2,-2,-1,-1;-2,2,1,-1,-2,0,0;-4,-1,-1,1,1,1,0;-1,2,3,1,-1,1,0;-1,1,1,1,-1,1,-1;-1,1,1,2,-1,1,0;-2,0,1,0,0,0,-1;0,2,2,1,-3,-2,-1]
    s = reshape(Strain',7,2,[]) ;
    s = permute(s,[2 1 3]) ;
    iwant = squeeze(nanmean(s))' ;