MATLAB: Comment calculer des tableaux de séquençage dans une matrice

La matrice A a 2 colonnes: la première est l’ID et la seconde le degré.
 
A = [2842198 7
2842198 7
2842198 2
2842198 7
2842198 7
2842198 6
2842198 1
2842443 7
2842443 7
2842443 8
2842443 4
2842443 6
2842463 7
2842463 9
2842463 7
2842463 6
2842463 5
2842463 7
2842463 7
2842463 6
2842463 3
2842463 10
2842463 3
2842463 6
];
 
Je veux trouver la matrice de séquence de la matrice A comme ceci (matrice B).
 
B = [0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 1 0 1 0 1 2 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
];
 
Puisqu’il y a 10 degrés différents dans la matrice A, alors la dimension de la matrice B est 10 * 10. Par exemple, la première ligne de la matrice B fait référence au degré « 1 ». Si la deuxième ligne de la matrice A est « 1 », alors B (1,1) doit être 1, sinon 0. Dans cet exemple, la deuxième ligne de la matrice A est 7, alors B (1,7) = 7. Cette la procédure doit être répétée jusqu’à ce que l’ID change dans la matrice A.
De plus, pour chaque ID unique dans la matrice A, la séquence de la dernière ligne doit être comparée à la première ligne du même ID unique. Par exemple ici pour l’ID 2842198, le dernier degré de ligne est 1 et par la suite la première ligne du même ID unique est 7. Ainsi, le résultat dans la matrice B (1,7) devrait être 1.
Enfin, s’il y a une séquence répétée plus de 1, alors le résultat dans la matrice B doit être résumé. Par exemple, une séquence de 7 et 7 répétée 2 fois, donc le résultat en B (7,7) est 2.

Meilleure réponse

  • Si j’ai bien compris, un simple accumarrayest tout ce dont vous avez besoin:
     

    ids = unique(A(:, 1));
    numdegrees = max(A(:, 2));
    out = cell(numel(ids), 2);
    for idxid = 1:numel(ids)
    Aid = A(A(:, 1) == ids(idxid), :);
    out{idxid, 1} = ids(idxid);
    out{idxid, 2} = accumarray([Aid(:, 2), Aid([2:end, 1], 2)], 1, [numdegrees, numdegrees]);
    end

     

  • MATLAB: Créer une nouvelle matrice avec 0, -1 et 1 si et où dans une autre matrice apparaît une valeur max

    Bonjour, j’essaie de bien expliquer mon problème… J’ai un tableau A (200 × 14) dans lequel toutes les lignes affichent 14 valeurs pour chaque période d’observation. Je dois créer une autre matrice B dans laquelle, pour chaque ligne, les valeurs doivent être 1 si c’est la valeur maximale, -1 si c’est le min et 0 sinon. J’essaie de mieux expliquer, par exemple, si dans A, dans la première ligne, les valeurs sont: [0,5 1 3 4,6 2,8 3,4 6,7 0,01 2,3 8,4 5,1 7,3 1,8 4,3] dans la matrice B, les valeurs doivent être [0 0 0 0 0 0 0 -1 0 1 0 0 0 0] et je dois le faire pour chaque ligne (étant donné que les valeurs dans les lignes A ne sont pas les mêmes pour chaque ligne). Est-ce possible? Quelqu’un peut-il m’expliquer comment? J’ai essayé avec if, elseif else… mais je pense qu’il y a quelque chose qui ne fonctionne pas. MERCI

    Meilleure réponse

  • Cela ressemble à des devoirs, mais j’espère que ce n’est pas le cas et que vous pourrez ensuite l’utiliser. C’est plus long que Roger et c’est une approche « for loop », mais j’ai pensé que vous aimeriez voir plusieurs approches différentes. Vous avez oublié de partager votre approche ifelse cependant.
     

    m = rand(200, 14); % Create sample data.
    B = zeros(size(m)); % Initialize output to all 0's.
    for row = 1 : size(m, 1)
    % Find max location in this row.
    [~, indexOfMax] = max(m(row, :));
    % Set B = 1 there
    B(row, indexOfMax) = 1;
    % Find min location in this row.
    [~, indexOfMin] = min(m(row, :));
    % Set B = -1 there
    B(row, indexOfMin) = -1;
    end

     

  • MATLAB: Quel est le problème avec la deuxième boucle ‘IF’? Le programme se termine après être entré dans la boucle.

    Je peux entrer dans le deuxième « IF » mais le programme simulink se termine après l’exécution des lignes dans la deuxième condition « IF ». Simulink s’exécute pendant le temps requis sans la deuxième condition « IF ».
     

    function [Out] = LMAImplementation_Motor(In)
    persistent eWithNoChange eWithDeltaL eWithDeltaK
    e = In(1);
    L = In(2);
    K = In(3);
    Clock = In(4);
    if (0.0000 <= Clock) && (Clock <= 0.9999)
    deltaK = 0; deltaL = 0;
    eWithNoChange(end+1) = e;
    [m,n] = size(eWithNoChange);
    end
    if n == 30001 %THIS LINE WAS BOLD
    eWithNoChange(:,1) = [];
    sizeofeWithNoChange = size(eWithNoChange)
    end
    if (1.0000 <= Clock) && (Clock <= 1.9999)
    deltaL = L*0.1; deltaK = 0;
    eWithDeltaL(end+1) = e;
    end
    Out = [deltaL,deltaK,Clock];

     

    MATLAB: comment trier une matrice en fonction des ID de colonne et identifier les mêmes combinaisons

    Salut,
    Je modifie la question: j’ai la matrice M avec six colonnes et n lignes:
     
    M = [HomeID, WorkID, SchoolID, ShopID, timeS, timeP];
    for example (lets say it is already sorted):
    M = [101, 201, 301, 401, 5.46, 7.83;
    101, 201, 301, 401, 3.63, 4.52;
    101, 201, 301, 401, 2.785, 2.99;
    102, 205, 301, 401, 3.53, 8.5;
    102, 205, 301, 402, 3.48, 8.9];
     
    Je veux le faire sous la forme de:
     
    M2 = [101, 201, 301, 401, 3.958, 5.113;
    102, 205, 301, 401, 3.53, 8.5;
    102, 205, 301, 402, 3.48, 8.9];
     
    Je veux faire un calcul pour chaque paire unique de combinaison SchoolID-WorkID dans chaque paire unique de combinaison HomeID-WorkID et produire une matrice qui n’aura pas plusieurs registres Home-Work-School-Shop mais les uniques avec les valeurs moyennes à la place [M2(1,4)=(M(1,4)+M(2,4)+M(3,4))/3].
    Merci,
    Iro

    Meilleure réponse

  • Accumarrayserait utile ici. C’est une fonction plutôt utile, mais peut prendre un peu de lecture pour la comprendre complètement. Fondamentalement, il prend une liste de coordonnées (indices) et les valeurs qui leur sont associées. Il effectue ensuite une opération sur toutes les valeurs qui ont les mêmes indices et sort la valeur résultante en tant qu’entrée dans une matrice. Dans ce cas, vous voulez prendre la moyenne de ces valeurs qui ont les mêmes HomeID WorkID SchoolID et ShopID.
    Voici comment nous procédons:
     

    % Get the unique combinations, and the indexes
    [HomeSchoolWorkShop_ID,~,y_ind] = unique(M(:,1:4),'rows');
    x_ind = 1:size(M,2)-4;
    % Make a list of the indexes and values
    [X_Ind,Y_Ind] = meshgrid(x_ind,y_ind);
    Inds = [Y_Ind(:) X_Ind(:)];
    vals = reshape(M(:,5:end),[],1);
    % Take the average
    M2 = [HomeSchoolWorkShop_ID accumarray(Inds,vals,[],@mean)]

     

  • MATLAB: Si l’instruction répond différemment lorsque variable d’entrée vs nombre

    Je ne comprends pas pourquoi la déclaration if produit ici des résultats différents. Dans une déclaration, j’utilise les noms de variables et dans l’autre, je remplace les valeurs des variables par les noms. Chaque instruction if doit produire la valeur «true» car aucune valeur n’est modifiée.
     
    >> time_end
    time_end =
    30.0000
    >> time_met_end
    time_met_end =
    30
    >> if time_end>time_met_end
    disp('true')
    end
    true
    >> if 30.0000 > 30
    disp('true')
    end
    >>
    >>
     

    Meilleure réponse

  • Voir la FAQ Pourquoi 0,3-0,2-0,1 n’est pas égal à zéro?pour le fond dans « pourquoi ». La variable contenant ce qui est imprimé sur la ligne de commande comme 30.0000 n’est pas assezça, exactement. Que les zéros de fin après la décimale soient imprimés est le signe que ce n’est pas une valeur entière.
    Essayer
     
    time_end-30
     
    pour voir le reste
     

    fprintf('%.15e',time_end)

     

  • MATLAB: Opérations entre matrices, calcul différent selon les conditions.

    Je veux multiplier deux matrices, mais cela dépend des conditions que je vais opérer avec une autre expression.
    Si nous nommons les matrices « A » et « B », matrices de colonnes, je veux les multiplier. J’ai deux opérations que j’utiliserai selon les conditions pour continuer.
    J’ai essayé avec ce code:
     

    d = [64;
    108;
    454;
    498;
    542;
    586];
    As = [852;
    568;
    568;
    568;
    568;
    852];
    fs = [-344.4991;
    -168.8422;
    420.0000;
    420.0000;
    420.0000;
    420.0000];
    c = 150;
    if d<c
    Cs(:,1) = (fs-.85*21).*As/1000;
    else
    Cs(:,1) = (fs).*As/1000;
    end

     

    MATLAB: comment écrire une fonction If () AND () dans MATLAB

    Salut,
    Je me demandais quelle était la meilleure façon d’écrire une fonction IF () AND (). Par exemple, si j’ai les informations suivantes, je souhaite sélectionner les valeurs de la ligne 3 associées aux valeurs qui ont 11 dans la colonne1 et un 1 dans la colonne2. Comment puis-je écrire le code pour ce faire?
     
    column1 column2 column 3 column 4
    11 1 6 5
    11 1 8 2
    12 1 7 0
    21 1 3 8
    21 1 2 9
     

    Meilleure réponse

  • Cela marche:
     

    M = [11 1 6 5
    11 1 8 2
    12 1 7 0
    21 1 3 8
    21 1 2 9];
    Out = M((M(:,1) == 11) & (M(:,2) == 1),3)
    Out =
    6
    8

     

  • MATLAB: Bien que le problème des boucles et des volets, besoin de conseils

    J’ai un programme qui règle les volets d’un avion (théoriquement) de haut en bas de 5 degrés à chaque fois, mais quand j’arrive à 30, je ne devrais afficher que les volets complètement baissés, et quand il arrive à 0, les volets devraient être complètement relevés et ne devraient pas afficher les degrés. Y a-t-il une fonction qui me sortira de la loi elseif? parce que la rupture; me sort de tout le programme. Voici mon programme:
    % Simulateur de volet de cockpit en verre:
    total = 0;
    cnt = 0;
    encore = vrai;
    encore une fois == vrai
     
    let=lower(input('U for up, D for down, Q for quit:','s'));
    cnt=cnt+1;
    if let~='u' && let~='d' && let~= 'q'
    fprintf('Please enter a valid response!\n')
    elseif let=='u' && total>0
    total=total-5;
    if total==0
    fprintf('Flaps Full UP')
    end
    fprintf('Flaps at %g degrees\n',total)
    elseif let=='d' && total<30
    total=total+5;
    if total==30
    fprintf('Flaps Full DOWN')
    end
    fprintf('Flaps at %g degrees\n',total)
    elseif let=='q'
    fprintf('Thanks for testing your flaps design!\n')
    again=false;
    elseif total== 30
    fprintf('Flaps Full DOWN\n')
    elseif total==0
    fprintf('Flaps Full UP\n')
    end
    end
     

    Meilleure réponse

  •  
    If total >= 30
    %flaps full down
    end
     
    Lisez aussi:
     

    doc le
    doc ge
    doc lt
    doc gt

     

  • MATLAB: comment placer toutes les valeurs inférieures à 1 dans un nouveau tableau

    Disons que j’ai un tableau x = [1 2 3 4 5 6 0 1 0 4 0 8 0 8 6 0], à partir duquel je veux lire uniquement les zéros et les placer dans un nouveau tableau. jusqu’à présent, je l’ai
     
    for i = 1:size(x)
    for m = 1:size(x)
    if x(i) < 1
    newArray = [x(m) > 1]
    end
    end
    end
     
    Je ne sais pas comment mettre en œuvre cela. Toute aide serait appréciée

    Meilleure réponse

  •  
    x = [ 1 2 3 4 5 6 0 1 0 4 0 8 0 8 6 0]
    out=x(x<1)
     
    vous pouvez calculer
     

    y=setdiff(x,out)

     

  • MATLAB: Créer une matrice après de nombreuses conditions

    Je voudrais poser des questions sur la construction de la matrice après de nombreuses conditions différentes. Je veux dire que la matrice ne doit contenir que les bonnes conditions. J’ai écrit ce programme simple mais cela ne fonctionne pas:
     

    r=7;
    j=16;
    k=18;
    if r>5
    b1=[ r r]
    elseif j<10
    b2=[j j]
    elseif k>9
    b3=[ k k]
    end
    M=[b1;b2;b3]
    after running this program M will contain only b1, but I want it to contain the right conditions which means it should contain b1 and b3 and it should not contain b2 because the condition wrong and does not work.
    can anyone help me please???