Codice Matlab per confronto righe

di il
1 risposte

Codice Matlab per confronto righe

Salve a tutti, ho un problema con un codice su matlab. Spiego brevemente: ho una matrice 8x4 composta da tutti 0 ed 1. Quello che devo fare è raggruppare tutte le righe identiche e poi una volta raggruppate contare quante sono. esistono funzioni su matlab che possono farlo? avete suggerimenti o esempi?
grazie a tutti

1 Risposte

  • Re: Codice Matlab per confronto righe

    Ci sono tanti metodi possibili.
    Alcuni esempi:
    [*] il più semplice: usare la funzione "unique" specificando il parametro "rows" nella chiamata e tre parametri di output (fai riferimento alla documentazione per i dettagli)
    [*] il più "facile": due loop annidati che confrontino la prima riga con tutte le altre, poi la seconda con le rimanenti e così via. Due righe con "0" e "1" sono uguali se la somma dei valori assoluti delle differenze tra gli elementi delle righe è uguale a 0. Questo metodo può essere utile nel caso si voglia fare pratica con il loop e la manipolazione degli indici della matrici
    [*] il più bizzarro: convertire la sequenza di "0" e "1" delle righe n numeri binari e poi in numeri decimali per ottenere un vettore; quindi usare la funzione "unique" per trovare gli elementi "unici" del vettore
    
    
    %
    % Generate the input matrix
    %
    n_col=10;
    n_sub_mat=5;
    
    s1=randi([0 1],1,n_col);
    s2=randi([0 1],1,n_col);
    s3=randi([0 1],1,n_col);
    
    m1=[repmat(s1,randi([1 n_sub_mat],1,1),1); ...
        repmat(s2,randi([1 n_sub_mat],1,1),1); ...
        repmat(s3,randi([1 n_sub_mat],1,1),1)];
    m=m1(randperm(size(m1,1)),:);
    %
    % Two nested loops solution
    %
    tic
    % Initialize the index array
    idx=nan(1,size(m,1));
    % Loop over the rows of the input matrix
    idx(1)=1;
    for i=1:size(m,1)-1
       if(isnan(idx(i)) || i == 1)
          idx(i)=i;
       else
          continue
       end
       for j=i+1:size(m,1)
    %     Two row are identical if the sum of the absolute value of the difference
    %     between the component is 0
          d=sum(abs(m(i,1:end-1)-m(j,1:end-1)));
          if(d == 0 && isnan(idx(j)))
    %     Store in the index array the number of the row matching
          idx(j)=i;
          end
       end
    end
    % Check for the case the last row is unique
    if(isnan(idx(end)))
       idx(end)=max(idx)+1;
    end
    % Find the unique indices of the rows
    uni=unique(idx);
    toc
    % Store in a cell array:
    %    the row indices of the input matrix that are equal
    %    the corresponding row
    %    the number of the rows
    for i=1:length(uni)
       x{i,1}=find(idx == uni(i));
    %   x{i,2}=m(x{i,1},:);
       x{i,2}=m(x{i,1}(1),:);
       x{i,3}=length(x{i,1});
    end
    
    %%%%%%%%%%%%%%
    tic
    %
    % Simpliest method with built-in function
    %
    % Find the uniques rows
    %
    [a,b,c]=unique(m,'rows');
    toc
    % Store in a cell array:
    %    the row indices of the input matrix that are equal
    %    the corresponding row
    %    the number of the rows
    for i=1:length(b)
       x2{i,1}=find(c == c(i));
    %   x2{i,2}=m(x2{i,1},:);
       x2{i,2}=m(x2{i,1}(1),:);
       x2{i,3}=length(x2{i,1});
    end
    %%%%%%%%%%%%%%
    %
    % A bizarre method
    %
    tic
    % COnvert the input matrix in a matrix of strings
    % Interpret the matrix of strings as a matrix of binary numbers
    % Convert them into an array of decimal numbers
    idx1=bin2dec(num2str(m))';
    % Find the uniques decimal numbers
    uni1=unique(idx1);
    toc
    % Store in a cell array:
    %    the row indices of the input matrix that are equal
    %    the corresponding row
    %    the number of the rows
    for i=1:length(uni1)
       x1{i,1}=find(idx1 == uni1(i));
    %   x1{i,2}=m(x1{i,1},:);
       x1{i,2}=m(x1{i,1}(1),:);
       x1{i,3}=length(x1{i,1});
    end
    
    
    
Devi accedere o registrarti per scrivere nel forum
1 risposte