MATLAB: Comment transférer aléatoirement quelques lignes d’une matrice A vers d’autres matrices de l’ensemble de N matrices

Par exemple, nous avons 5 matrices A, B, C, D, E et nous sélectionnons la meilleure matrice en fonction d’un certain paramètre et supposons qu’il s’agit de A, puis nous transférons quelques lignes de la matrice A vers les lignes correspondantes d’autres matrices (B , C, D et E).
Par exemple
 
A = [0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 0 0 0 0 1 0
0 1 0 0 0 0 0
0 0 0 0 0 0 1]
B = [0 1 0 0 0 0 0
1 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 1 0 0 0 0]
C = [1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 0 1 0 0 0 0
0 0 0 0 0 1 0
0 0 0 1 0 0 0]
D = [0 0 1 0 0 0 0
0 0 0 0 1 0 0
1 0 0 0 0 0 0
0 0 0 1 0 0 0
0 1 0 0 0 0 0]
E = [0 0 0 0 0 1 0
0 0 0 1 0 0 0
0 1 0 0 0 0 0
0 0 1 0 0 0 0
1 0 0 0 0 0 0]
 
Maintenant, nous sélectionnons la matrice A et transférons au hasard quelques lignes (supposons les 2e et 4e lignes) aux lignes correspondantes des autres matrices B, C, D et E et le résultat devrait être comme ceci.
 
A = [0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 0 0 0 0 1 0
0 1 0 0 0 0 0
0 0 0 0 0 0 1]
B = [0 1 0 0 0 0 0
0 0 1 0 0 0 0
0 0 0 1 0 0 0
0 1 0 0 0 0 0
0 0 1 0 0 0 0]
C = [1 0 0 0 0 0 0
0 0 1 0 0 0 0
0 0 1 0 0 0 0
0 1 0 0 0 0 0
0 0 0 1 0 0 0]
D = [0 0 1 0 0 0 0
0 0 1 0 0 0 0
1 0 0 0 0 0 0
0 1 0 0 0 0 0
0 1 0 0 0 0 0]
E = [0 0 0 0 0 1 0
0 0 1 0 0 0 0
0 1 0 0 0 0 0
0 1 0 0 0 0 0
1 0 0 0 0 0 0]
 

Meilleure réponse

  • Vraiment, le plus simple est de concaténer vos matrices en un tableau 3D.
    En supposant que votre ResultMest un tableau de cellules:
     
    allmatrices = cat(3, ResultM{:});
     
    Il est alors trivial de copier les lignes d’une page vers les autres pages:
     

    selectedpage = 1; %1 for A, 2 for B, etc.
    selectedrows = randperm(size(allmatrices, 1), 2); %two random rows
    %copy selected rows of selected page to all pages:
    allmatrices(selectedrows, :, :) = repmat(allmatrices(selectedrows, :, selectedpage), 1, 1, size(allmatrices, 3));

     

  • MATLAB: Comment échanger quelques lignes au hasard entre les matrices A et B (la matrice B est choisie au hasard dans un ensemble de N matrices)

    Par exemple, nous avons ‘ResultM’ qui donne 5 matrices A, B, C, D, E et nous devons échanger quelques lignes aléatoires entre la matrice A et toute autre matrice B sélectionnée au hasard parmi ces 5 matrices. Nous sélectionnons d’abord une matrice au hasard parmi 5 matrices, puis nous sélectionnons quelques lignes au hasard et échangeons des lignes entre ces matrices (matrice A et matrice sélectionnées au hasard). Le même processus est suivi pour toutes les matrices de l’ensemble.
    Exemple: opération d’échange de flèche entre la matrice A et la matrice sélectionnée au hasard
    puis entre la matrice B et la matrice sélectionnée au hasard
    puis entre la matrice C et la matrice sélectionnée au hasard
    puis entre la matrice D et la matrice sélectionnée au hasard
    puis entre la matrice E et la matrice sélectionnée au hasard
    Une nouvelle matrice aléatoire est choisie pour chaque opération d’échange de lignes.
    Par exemple, nous avons la matrice A
     
    A = [0 0 0 1 0 0 0
    0 0 1 0 0 0 0
    0 0 0 0 0 1 0
    0 1 0 0 0 0 0
    0 0 0 0 0 0 1]
    And we randomly choose matrix D (say)
    D = [0 1 0 0 0 0 0
    1 0 0 0 0 0 0
    0 0 0 1 0 0 0
    0 0 0 0 1 0 0
    0 0 1 0 0 0 0]
    Then we select a few rows randomly (say 2 and 4) and exchange.
    The resulting matrices are
    A = [0 0 0 1 0 0 0
    1 0 0 0 0 0 0
    0 0 0 0 0 1 0
    0 0 0 0 1 0 0
    0 0 0 0 0 0 1]
    D = [0 1 0 0 0 0 0
    0 0 1 0 0 0 0
    0 0 0 1 0 0 0
    0 1 0 0 0 0 0
    0 0 1 0 0 0 0]
     
    De même, nous effectuons une opération d’échange de lignes pour toutes les matrices de l’ensemble.

    Meilleure réponse

  •  

    A = rand(5,7,5) ; % your A,B,C,D and E matrices in 3D
    A0 = A ;
    [m,n,p] = size(A) ;
    for i = 1:p
    idx = randperm(p,2) ; % selecte two rows randomly
    matrices = randperm(p,1) ; % select one matrix randomly
    A(idx,:,matrices) = A(idx,:,i) ; % replace random rows in selected matrix
    end

     

  • MATLAB: Comment puis-je séparer les colonnes en comparant les valeurs de la première ligne

    J’ai une matrice
     
    A= 0 1 0 0 1 1 1 1 1 1
    0 1 0 0 1 1 1 1 1 1
    0 1 0 0 1 0 1 1 1 1
    0 1 0 0 1 1 1 1 1 0
    1 1 0 0 1 1 1 0 1 1
    0 1 0 0 1 1 1 0 1 1
    0 1 0 0 1 1 0 1 1 1
    0 1 0 0 1 1 1 1 0 0
    0 1 0 0 1 1 1 1 1 1
    0 0 0 0 1 1 1 1 1 0
    0 1 0 0 1 1 1 1 1 1
     
    où, par rapport à la première ligne, je veux avoir deux matrices distinctes comme B avec toutes les valeurs qui auront A (1,:) == 0 et C avec toutes les valeurs qui seront A (1,:) == 1
    En d’autres termes, à partir de cet exemple, je veux séparer la 1ère, la 3ème et la 4ème colonne dans une matrice séparée et d’autres dans une autre matrice.

    Meilleure réponse

  •  

    t = A(:,1) == 0;
    B = A(:,t)
    C = A(:,~t)

     

  • 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 supprimer les éléments indésirables d’une matrice en fonction de certaines hypothèses de caractère d’entrée d’une entrée à 6 tuples

    J’ai la matrice de 729 × 6 éléments. Chacun des 729 éléments a 6 caractères (i, j, k, l, m, n).
    De plus, j’ai certaines conditions initiales concernant ces caractères données et je veux supprimer les éléments dont les caractères dans les éléments ne remplissent pas les conditions initiales.
    Quel codage, quelles commandes sont nécessaires pour effectuer la tâche d’application des conditions initiales à la matrice des éléments obtenus dans MATLAB?
    Les conditions initiales comprennent
     
    i=0,1,2
    k=1
    l=1
    m=1
     
    Veuillez dire. Je vous remercie
    J’ai joint la matrice des éléments pour référence rapide.

    Meilleure réponse

  •  

    mask = ismember(ijklmn(:,1), [0, 1, 2]) & all(ijklmn(:,3:5) == 1, 2);
    ijklmn = ijklmn(mask, :);

     

  • MATLAB: Veuillez votre aide est nécessaire. J’ai le tableau 3-D suivant et je voudrais additionner les valeurs dans la deuxième colonne et la troisième colonne en fonction de leurs valeurs d’index dans la première colonne.

     
    % |Bus | PGi | QGi |
    M = [1 10 0;
    1 10 0;
    1 76 14.1;
    1 76 14.1;
    2 10 0;
    2 10 0;
    2 76 7.0;
    2 76 7.0;
    7 80 17.2;
    7 80 17.2;
    7 80 17.2;
    13 95.1 40.7;
    13 95.1 40.7;
    13 95.1 40.7;
    15 12 0;
    15 12 0;
    15 12 0;
    15 12 0;
    15 12 0;
    15 155 0.05;
    16 155 25.22;
    18 400 137.4;
    21 400 108.2;
    22 50 -4.96;
    22 50 -4.96;
    22 50 -4.96;
    22 50 -4.96;
    22 50 -4.96;
    22 50 -4.96;
    23 155 31.79;
    23 155 31.79;
    23 350 71.78];
     

    Meilleure réponse

  • Puisque vous avez une sorte d’étiquette attachée aux 3 colonnes de votre tableau, une autre option à la réponse de Stephen est de convertir le tableau en une table qui convient parfaitement à cela:
     
    t = array2table(M, 'VariableNames', {'Bus', 'Pgi', 'QGi'})
     
    Il est alors trivial de calculer la somme par Bus:
     

    varfun(@sum, t, 'GroupingVariables', 'Bus') %apply sum to each variable of the table, grouping by 'Bus'

     

  • MATLAB: Comment obtenir la valeur minimale quotidienne de la température à partir d’une matrice tridimensionnelle

    Disons que nous avons une matrice (disons ‘a’) avec 129x135x721 dimension.i.e.lat x lon x time… le temps est de 720 (24 * 30) pour les données horaires pour les valeurs d’un mois. Supposons que ces données soient des données de température. Maintenant, je dois savoir à quelle heure de la journée la température est minimale, donc pour cela, je dois d’abord trouver la valeur moyenne de la température à 1 heure, 2,3,4 toutes les 24 heures. c’est-à-dire, moyenne de (1: 25: 720) Moyenne similaire de (2: 26: 720) et ainsi de suite. Enfin, pour chaque lat, nous obtenons maintenant 24 valeurs, ou nous obtiendrons une matrice finale de 129x135x24 et à partir de cela, je dois trouver le temps de valeur minimum. S’il vous plaît, aidez-moi à le faire

    Meilleure réponse

  • Faites votre tableau en 4 dimensions,
     

    a=reshape(a, 129,135,24,30);
    hourlymeans=mean(a,4);
    [~,minhour]=min(hourlymeans,[],3);

     

  • MATLAB: Méthode efficace pour remplir une matrice basée sur son égalité avec une autre matrice

    Bonjour. J’ai un problème pour remplir une matrice et j’apprécierais grandement une aide.
    Si nous avons:
     
    if true
    A = 10 11 3 4 B = 10 11 NaN NaN
    12 11 4 6 12 11 NaN NaN
    13 13 2 8 13 11 NaN NaN
    end
     
    Ce que je veux, c’est ce qui suit: si A (i, 1: 2) et B (i, 1: 2) sont identiques, alors B (i, 3: 4) = A (i, 3: 4). Donc quelque chose comme ça:
     
    if true
    B = 10 11 3 4
    12 11 4 6
    13 11 NaN NaN
    end
     
    J’ai réussi à créer une boucle qui atteint ce résultat. Ce qui est le suivant:
     
    if true
    for i = 1:length(B);
    for j = 1:length(A);
    if B(i,1) == A(j,1) && B(i,2) == A(j,2);
    B(i,3) = A(j,3);
    end
    end
    end
    end
     
    Le problème est que les deux tableaux avec lesquels je travaille ont près de 3 millions de lignes, donc une double boucle conditionnée est extrêmement lente. Existe-t-il un moyen vectorisé pour obtenir le même résultat qui est beaucoup plus rapide?
    Toute aide serait grandement appréciée.
    Merci
    Andrew

    Meilleure réponse

  •  
    [lo,ii] = ismember(A(:,1:2),B(:,1:2),'rows');
    B(ii(lo),:) = A(lo,:);
     
    ou
     

    lo = all(A(:,1:2) == B(:,1:2),2);
    B(lo,:) = A(lo,:);

     

  • MATLAB: Comment avoir la sortie dans une matrice après avoir fait des calculs sur un nombre spécifique d’échantillons dans For Loop

    Je souhaite effectuer un calcul sur 1250 échantillons à la fois. Je veux aussi retirer ce nombre d’échantillons en utilisant leurs indices. Comme je serai de rejeter les artefacts de cette façon.
    %% m = longueur (arti_pos); %% arti_pos a la position des échantillons
    pour i = 1: m
     
    x=filtered_c3(arti_pos(i):arti_pos(i)+1250); filtered c_3 and c_4 is my input filtered data
    y=filtered_c4(arti_pos(i):arti_pos(i)+1250);
    [Pxx3,F] = pyulear(x,5,512,100); %% and wish to perform these functions on the sample
    [Pxx4,F] = pyulear(y,5,512,100);
    PSD=[Pxx3 Pxx4];
    [COEFF, W] = pca(PSD);
    WP=(W*COEFF');
    w3 = WP(1:end,1);
    w4 = WP(1:end,2);
    t=w3+w4;
    end
     
    Je veux prendre la somme de toutes les w3 et w4 de mes données (de 1 à m) dans la matrice et trouver leur t et ajouter dans une matrice

    Meilleure réponse

  • Vous pouvez enregistrer tous les résultats dans un celluletableau comme celui-ci.
     

    allResults = cell(1, 117);
    for i = 1:m
    x=filtered_c3(arti_pos(i):arti_pos(i)+1250); %filtered c_3 and c_4 is my input filtered data
    y=filtered_c4(arti_pos(i):arti_pos(i)+1250);
    [Pxx3,F] = pyulear(x,5,512,100); %% and wish to perform these functions on the sample
    [Pxx4,F] = pyulear(y,5,512,100);
    PSD=[Pxx3 Pxx4];
    [COEFF, W] = pca(PSD);
    WP=(W*COEFF');
    w3 = WP(1:end,1);
    w4 = WP(1:end,2);
    allResults{i} = w3+w4;
    end

     

  • MATLAB: COMMENT REPLACER LES ÉLÉMENTS DANS L’ORDRE DANS LES MATRICES QUI SONT DÉPLACÉS EN DIAGONALITÉ

    1 4 6 8 2 3 7 9 5
    tous les éléments se déplacent en diagonale d’un pixel pour le m * n matix LORS DE L’APPLICATION DU CODE SUIVANT
     
    I = [
    1 4 6
    8 2 3
    7 9 5]; % initial array
    idx = reshape(1:numel(I),size(I));
    for jj = -size(I,1) + 2 : size(I,2) - 2
    a = diag(idx,jj);
    I(a) = I(circshift(a,1));
    end
     
    exemple de sortie
    2 3 6
    9 5 4
    7 8 1
    HOW TO GET THE ORIGINAL RESULT TO SHIFT DIAGONALLY . THE EXAMPLE OUTPUT IS
    1 4 6 8 2 3 7 9 5

    Meilleure réponse

  • Demandez-vous comment annuler ce que fait votre code?
     

    for jj = -size(I,1) + 2 : size(I,2) - 2
    a = diag(idx,jj);
    I(a) = I(circshift(a,-1)); % Note the -1
    end