2013-08-27 14 views
6

Sto scrivendo un compito a casa e mi imbatto in questo errore utilizzando Octave. Non influisce sulla funzionalità della mia soluzione, tuttavia sono curioso del motivo per cui questo avviso viene emesso.'operazione di trasmissione automatica applicata' su matrici di uguali dimensioni

% X is column vector, p is max degree of polynom 
% example: 
% X = [1;2;3;4], p = 3 
% X_poly = [1,1,1; 2,4,8; 3,9,27; 4,16,64] 
function [X_poly] = polyFeatures(X, p) 

powers = ones(numel(X),1) * linspace(1,p,p); 
X_poly = X .^ powers; 

end 

saluti,
Tom

risposta

3

avviare l'analisi con questo:

powers = ones(numel(X),1) * linspace(1,p,p); 

Il fattore di sinistra è ovviamente numel(X) -by- 1, e il fattore di destra è 1 -by- p e ottieni una matrice che è numel(X) -da- p.

allora ecco il problema:

X_poly = X .^ powers; 

L'operando sinistro è numel(X) -by- 1 e l'operando di destra è numel(X) -by- p. Questi non corrispondono.

Penso che dovrebbe essere semplicemente un errore, ma l'octave sta apparentemente cercando di capire cosa intendevi invece di ciò che hai scritto, ma poi ti dà un avvertimento che sta indovinando.

Per eseguire l'espansione di singleton, è possibile utilizzare bsxfun o repmat.

X_poly = bsxfun(@power, X, powers); 
X_poly = repmat(X, 1, p) .^ powers; 

Dal momento che il compito di powers è solo un modo disordinato di fare repmat, e bsxfun si espanderà entrambi i parametri, si può invece fare solo:

X_poly = bsxfun(@power, X, 1:p); 

che lo rende un po 'inutile avere uno speciale funzione per questo scopo.

enter image description here

+0

Beh, avrei potuto usare bsxfun, ma per motivi di esercizio volevo implementare questo comportamento da solo. L'unica cosa necessaria per far funzionare il mio codice è trasformare X anche allora. powers = ones (numel (X), 1) * linspace (1, p, p); Xs = X * ones (1, p); X_poly = Xs.^Powers; Grazie mille;) –

+1

"Penso che dovrebbe essere semplicemente un errore, ma l'octave sta apparentemente cercando di capire cosa intendi invece di ciò che hai scritto, ma poi ti avvisa che sta indovinando". Non è questa la ragione. Parte del linguaggio Octave è la trasmissione automatica (ispirata a NumPy), quindi ciò che scrivi in ​​quelle situazioni * è * la trasmissione. Il motivo dell'avvertimento è che è una nuova funzionalità e può sorprendere le persone. Questi tipi di avvertenze vengono solitamente rimossi dopo 2 rilasci. – carandraug

+1

@carandraug: Beh, la domanda è anche etichettata 'matlab', ed è illegale lì. –

12

trasmissione automatica è abbastanza nuova funzione Octave che getta in un bsxfun ovunque ci sia una mancata corrispondenza dimensione tra un Singleton e dimensione non Singleton.

In questo caso

X_poly = X^poteri.;

è sostituito con

X_poly = bsxfun (@Power, X, poteri);

Questo è perfettamente un comportamento legale di ottava e inoltre sembra essere esattamente ciò che si vuole fare, quindi non si per cambiarlo affatto.

L'avviso è perché Matlab non supporta la trasmissione automatica in modo che vogliano ricordare all'utente se si è tentato di eseguire questo codice in Matlab.

Inoltre, la pratica comune tra molti programmatori Octave è di affidarsi principalmente alla mancata corrispondenza delle dimensioni come metodo per rilevare i bug nel proprio programma.Una volta ho persino seguito una lezione di machine learning in cui il prof ha detto all'intera classe "Se tutte le dimensioni sono allineate, allora probabilmente è corretto". Questo è un terribile, terribile consiglio e un modo sicuro per assicurarsi che tutti falliscano i compiti a casa, ma riflette un approccio comune tra molti ricercatori a scrivere programmi Matlab/Octave.

Per questo motivo, l'introduzione della trasmissione automatica senza alcun avviso potrebbe causare difficoltà di tracciamento dei bug per te se non hai l'abitudine di fare esplicite asserzioni sugli input delle tue funzioni.

Se si vuole sbarazzarsi del l'avviso, si può semplicemente aggiungere

warning("off", "Octave:broadcast"); 

al codice.

Se si vuole mantenere una migliore compatibilità Matlab o semplicemente non utilizzare la trasmissione automatica e preferisce avere errore di ottava per aiutare a isolare i bug, è possibile aggiungere

warning ("error", "Octave:broadcast"); 

invece.

+0

+1 per aggiungere informazioni sulla compatibilità con Matlab. –

Problemi correlati