2013-09-23 9 views
7

Dopo aver trovato un po 'di logica in how empty structs are dealt with, volevo controllare come questo generalizzato alle matrici.Differenza tra il primo elemento della matrice 1x1 e tutti gli elementi della matrice 1x1

Qui ho notato la seguente:

Se si dispone di una matrice 1x1, e assegnare al primo elemento. Non è lo stesso che assegnare a tutti gli elementi.

Questo piuttosto mi sorprende dal momento che il primo elemento è in realtà lo stesso di tutti gli elementi in questo caso. Ecco le mie osservazioni:

x = 1; 
y = 1; 
z = 1; 

x(:) = []; % Evaluates to [] as I expected 
y(1) = []; % Evaluates to Empty matrix: 1-by-0, rather than [] 
z(1,1) = []; %Throws an error: 'Subscripted assignment dimension mismatch.' even though size(z) gives [1 1]; 
z(1,:) = []; % Evaluates to Empty matrix: 0-by-1, just like z(:,:) = [] 

Dopo aver visto questa la mia domanda è:

Perché l'assegnazione alla stessa cosa in modi diversi, portano a quattro diversi risultati?

+3

Sei solo interessato o è un problema reale per te? –

+1

@DennisJaheruddin Dovresti lavorare nel team QA di TMW :) –

+0

@SamRoberts La domanda * perché * è principalmente per interesse, ma soprattutto la differenza tra la prima e la quarta situazione mi ha fatto preoccupare della robustezza del mio codice. Quindi non è solo una domanda, ma anche un avvertimento. –

risposta

9

Sembra solo una cosa di consistenza.

Consente di considerare una matrice più grande e vedere se il comportamento è coerente con un 1 -by- 1 matrice (spoiler alert, è a mio parere):

X = rand(3); 

Caso 1:

X(1,1) = [] 

Non avrebbe senso che funzioni. Non possiamo preservare la forma e rilasciare un singolo elemento, quindi otteniamo un errore di disallineamento delle dimensioni, che è coerente con la tua osservazione. Anche la mancata corrispondenza delle dimensioni è un errore appropriato poiché stiamo cercando di forzare una matrice 0 -da- 0 in uno slot 1 -da- 1. (BTW su un lato nota È dici size(z) ti dà [1 1] ma size(z, 3) ti dà anche 1 e così fa size(z,7) ecc quindi in realtà si tratta di una matrice [1 1 1 ...)

Caso 2:

X(1) = [] 

Ciò si traduce in un X tale che size(X) è 1 -by- 8, MATLAB sembra felice di linearizzare la matrice se si specifica un indice lineare. Questo ha senso per me, e di nuovo è coerente con il caso 1 -by- 1 poiché si traduce in una matrice 1 -by- numel(X)-1 (cioè 1 -by- 0 per X = 1)

Caso 3:

X(1,:) = [] 

Questo è piuttosto semplice, rimuovere la prima riga quindi ora abbiamo una matrice n-1 -da- m. Quindi un 3 -by- 3 diventa un 2 -by- 3 quindi sono felice con una 1 -by- 1 diventare un 0 -by- 1 in questo caso. Si noti che X(:,1) = [] è anche coerente in un modo simile.

Caso 4:

X(:) = [] 

Questo fa solo senso, riassegnare l'intera matrice. Senza problemi. Nessuna ambiguità

Quindi, anche se sono sicuri, potrebbero significare inequivocabilmente la stessa cosa. Penso che sia una scelta progettuale perfettamente ragionevole per MATLAB avere risultati diversi che siano coerenti con matrici più grandi di quanto facciano sempre le stesse cose per una singola matrice di elementi.

+1

typo: caso 3 dovrebbe essere 'X (1,:) = []' per essere coerente con la descrizione – Amro

+0

@Amro Grazie, corretto – Dan

+5

@Dan Com'è chiaro tutto ora! :-) –

Problemi correlati