Cell matrix rimuovere righe vuote...HELP

di il
10 risposte

Cell matrix rimuovere righe vuote...HELP

Salve,

Immagino che questo non sia un grande problema ma non riesco a risolverlo con quello che trovo online. Devo rimuovere da una grande matrice di cell tutte le righe vuote.
Ho provato ad usare cellfun cosi':

empties = find(cellfun(@isempty,MATRIX));
MATRIX(empties) = [];

Questo funziona ma mi ritorna un vettore e non piu' una matrice. Vorrei che invece la struttura della matrice restasse intatta. Per esempio, da una matrice cosi:

[] [] []
[] [] []
[] [] []
'a' 'b' '1'
[] [] []
[] [] []
[] [] []
[] [] []
[] [] []
[] [] []
'd' 'e' '2'
[] [] []
[] [] []
[] [] []
[] [] []
[] [] []
[] [] []
'f' 'g' '3'
[] [] []


.. Vorrei ottenerne una cosi:

'a' 'b' '1'
'd' 'e' '2'
'f' 'g' '3'


Potete aiutarmi?
Grazie mille

Alessandra

10 Risposte

  • Re: Cell matrix rimuovere righe vuote...HELP

    Ciao.
    potresti fare semplicemente il reshape del vettore risultante...
  • Re: Cell matrix rimuovere righe vuote...HELP

    Ciao,

    Avevo gia' provato ma mi dice:

    reshape(MATRIX, r, c );
    ??? Error using ==> reshape
    To RESHAPE the number of elements must not change.
  • Re: Cell matrix rimuovere righe vuote...HELP

    Stai sbagliando i valori di c e r...
    ti sta dicendo che la dimensione del vettore che vuoi ridimensionare e i valori di c e r non sono compatibili, cioè c*r è diversa dalla lunghezza del vettore di partenza.
    Non ho scritto prima che il reshape lo puoi usare solo nel caso in cui le righe in cui c'è qualcosa non hanno elementi vuoti.
  • Re: Cell matrix rimuovere righe vuote...HELP

    Ok giusto, avevo messo i valori di c ed r dell matrice iniziale. Ho messo le dimensioni giuste ora e ho risolto il mio problema. Grazie mille, mi sei stato d'aiuto!!
    Buona giornata!

    Ale
  • Re: Cell matrix rimuovere righe vuote...HELP

    Figurati!
    Buona giornata anche a te!
  • Re: Cell matrix rimuovere righe vuote...HELP

    Buongiorno,
    Ho un problema analogo a questo descritto nel forum, ma con una aggiunta, ho un cell array 300x3 cell. in ogni colonna dell cell array che chiamerò classi c'è su ogni riga un vettore composto da due colonne. in ognuna di queste maxi classi ci sono degli elementi vuoti, parecchi, ma in righe differenti per ogni classe, e che non conosco a priori. vorrei semplicemente eliminare queste righe vuote e creare un cell array che sarà dunque composto da righe differenti per ogni classe. come posso fare? perché con il reshape se non erro devo conoscere la forma della matrice di destinazione. e con cellfun()... mi elimina le righe vuote, e crea un cell array, ma un vettore, e non visulalizzo più le classi che invece è mio obiettivo conservare.
    grazie in anticipo.
    Il pezzo di codice è questo:
    %%  load data
    clear all; close all; clc;
    load ex7data2.mat
    S=size(X,1);
    N_k=3;
    max_iter=10;
    l=randi(S); 
    m=randi(S);
    q=randi(S);
    center= [ X(l,:); X(m,:); X(q,:) ];
    class={};
    for g=1:max_iter    
        distance=zeros(S,N_k);
        t=1;
        r=1;
        h=1;
        
        for i=1:S
            for k=1:N_k;
                
                row_i= X(i,:);
                d= row_i-center(k,:);            
                distance(i,k)= norm(d);            
            end        
    
            [lo,index]=sort(distance(i,:));
            class_i=index(1,1);
            class(i,class_i)={X(i,:)};     
    
      end
    end
    
    
  • Re: Cell matrix rimuovere righe vuote...HELP

    Domanda: il numero di elementi vuoti in ogni colonna del cellarray è uguale per tutte le colonne o ogni colonna può avere un numero arbitrario di elementi vuoti?

    In altre parole, il tuo cellarray è del tipo:
    X = 
    
        [4x2 double]    [4x2 double]              []
                  []    [4x2 double]    [4x2 double]
                  []              []              []
        [4x2 double]              []    [4x2 double]
        [4x2 double]              []    [4x2 double]
                  []    [4x2 double]              []
    
    cioè, ogni colonna ha lo stesso numero di elementi vuoti anche se in posizioni diverse, oppure
    X = 
    
        [4x2 double]    [4x2 double]              []
                  []    [4x2 double]    [4x2 double]
        [4x2 double]              []              []
        [4x2 double]              []    [4x2 double]
        [4x2 double]    [4x2 double]    [4x2 double]
        [4x2 double]    [4x2 double]              []
    colone diverse hanno un numero diverso di elementi vuoti?
  • Re: Cell matrix rimuovere righe vuote...HELP

    La seconda che hai detto ogni colonna può avere un numero di zeri differenti e variabile ogni iterazione
  • Re: Cell matrix rimuovere righe vuote...HELP

    Con riferimento al secondo esempio nella risposta precedente, se il tuo cellarray colone diverse possono avere un numero diverso di elementi vuoti, eliminando gli elementi vuoti otterresti un cellarray nel quale:

    [*] la prima colonna contiene 5 righe
    [*] la seconda colonna contiene 4 righe
    [*] la terza colonna contiene 3 righe
    A = 
    
        [4x2 double]    [4x2 double]    [4x2 double]
        [4x2 double]    [4x2 double]    [4x2 double]
        [4x2 double]    [4x2 double]    [4x2 double]
        [4x2 double]    [4x2 double]                
        [4x2 double]                                
    
    Purtroppo questo non è possibile.

    In un cellarray (come in una matrice), tutte le righe devono avere lo stesso numero di colonne e viceversa (tutte le colonne devono avere lo stesso numero di righe).

    Tra l'altro, guardando il codice che hai inserito, il primo loop (indice "S") è basato sul numero delle righe del cellarray:
    S=size(X,1);
    
    [...]
    
       for i=1:S
    
    
    ma se le diverse colonne hanno un numero diverso di righe, il valore di "S" non sarà lo steso per tutte le colonne, per cui devi, comunque, modificare l'algoritmo che hai implementato.

    Dal momento che, come hai scritto, non conosci in anticipo il numero di elementi vuoti, quello che puoi fare è, per esempio, creare una struttura con tanti campi quante sono le colonne del cellarray ed assegnare ad ogni campo un cellarray che contenga gli elementi non vuoti di una determinata colonna.

    Lavorando con le strutture, puoi creare dinamicamente i vari campi in questo puoi scrivere un codice che funzioni indipendentemente dal numero di colonne.

    Data una struttura "my_struct" puoi creare, per esempio in un loop, tre campi di nome "field_1", "field_2" e "field_3", come nel codice che segue (a titolo di esempio, ad ogni campo viene assegnato anche un valore)
    for i=1:3
       my_struct.(['field_' num2str(i)])=i*100
    end
    che crea, appunto, la struttura:
    >> my_struct
    
    my_struct = 
    
        field_1: 100
        field_2: 200
        field_3: 300

    Di seguito l'implementazione dell'esempio nel caso del tuo cellarray:
    % Definizione di un cellarray di esempio
    A={rand(4,2), rand(4,2), [];
       [], rand(4,2), rand(4,2);
       rand(4,2), [], [];
       rand(4,2), [], rand(4,2);
       rand(4,2), rand(4,2), rand(4,2);
       rand(4,2), rand(4,2), []}
    % Identificazione degli indici posizione dei vettori non vuoti all'interno
    % del cellarray
    idx=~cellfun(@isempty,A)
    % Identificazion del numero di righe con elementi non vuoti per ogni
    % colonna del cellarray Identificazione del numero di colonne del cellarray
    n_row=sum(idx);
    % Identificazione del numero di colonne del cellarray
    A_col=size(A,2);
    % Loop sulle colonne del cellarray per estrarre i vettori non vuoti
    % Gli elementi non vuoti di ogni colonna del cellarrray (classi) vengono
    % assegnsati ad una struttura
    % Ogni campo della struttura corrisponde ad una colonna del cellarray
    for i=1:A_col
       classi.(['colonna_' num2str(i)])=A(idx(:,i),i);
    end
    
    classi
    
    classi.colonna_1
    classi.colonna_2
    classi.colonna_3
    
    
    che genera la struttura "classi" con i tre campi: "colonna_1", "colonna_2" e "colonna_3":
    classi = 
    
        colonna_1: {5x1 cell}
        colonna_2: {4x1 cell}
        colonna_3: {3x1 cell}
    
    
    ans = 
    
        [4x2 double]
        [4x2 double]
        [4x2 double]
        [4x2 double]
        [4x2 double]
    
    
    ans = 
    
        [4x2 double]
        [4x2 double]
        [4x2 double]
        [4x2 double]
    
    
    ans = 
    
        [4x2 double]
        [4x2 double]
        [4x2 double]
    
    Hope this helps.
  • Re: Cell matrix rimuovere righe vuote...HELP

    Grazie infinite della risposta lunga ed esauriente, mi sembra una ottima alternativa.
Devi accedere o registrarti per scrivere nel forum
10 risposte