MATLAB Language Uso di bsxfun


Esempio

Molto spesso, il motivo per cui il codice è stato scritto in un ciclo for consiste nel calcolare valori da quelli 'vicini'. La funzione bsxfun può essere usata spesso per farlo in un modo più succinto.

Ad esempio, si supponga di voler eseguire un'operazione a colonna sulla matrice B , sottraendo la media di ogni colonna da essa:

B = round(randn(5)*10);                  % Generate random data 
A = zeros(size(B));                      % Preallocate array
for col = 1:size(B,2);                    % Loop over columns
    A(:,col) = B(:,col) - mean(B(:,col));   % Subtract means 
end 

Questo metodo è inefficiente se B è grande, spesso a causa del fatto che MATLAB deve spostare il contenuto delle variabili attorno alla memoria. Usando bsxfun , si può fare lo stesso lavoro ordinatamente e facilmente in una sola riga:

A = bsxfun(@minus, B, mean(B));

Qui, @minus è una funzione che gestisce l'operatore minus ( - ) e verrà applicata tra gli elementi delle due matrici B e mean(B) . Sono possibili anche altre maniglie di funzione, anche quelle definite dall'utente.


Successivamente, si supponga di voler aggiungere il vettore di riga v a ciascuna riga nella matrice A :

v = [1,  2,  3];

A = [8,  1,  6
     3,  5,  7
     4,  9,  2];

L'approccio ingenuo è usare un ciclo ( non farlo ):

B = zeros(3);
for row = 1:3
    B(row,:) = A(row,:) + v;
end

Un'altra opzione sarebbe quella di replicare v con repmat ( non farlo neanche ):

>> v = repmat(v,3,1)
v =
     1     2     3
     1     2     3
     1     2     3

>> B = A + v; 

Usa invece bsxfun per questa attività:

>> B = bsxfun(@plus, A, v);
B =
     9     3     9
     4     7    10
     5    11     5

Sintassi

bsxfun(@fun, A, B)

dove @fun è una delle funzioni supportate e i due array A e B rispettano le due condizioni seguenti.

Il nome bsxfun aiuta a capire come funziona la funzione e si distingue per la B ction FUN fabbrica di alcune componenti con S Ingleton e X pansion. In altre parole, se:

  1. due array condividono le stesse dimensioni tranne uno
  2. e la dimensione discordante è un singleton (cioè ha una dimensione di 1 ) in uno dei due array

quindi l'array con la dimensione Singleton verrà espanso per corrispondere alla dimensione dell'altro array. Dopo l'espansione, una funzione binaria viene applicata elementwise sui due array.

Ad esempio, sia A un array M -by- N -by K e B sia un array M -by- N . In primo luogo, le loro prime due dimensioni hanno dimensioni corrispondenti. In secondo luogo, A ha livelli K mentre B ha implicitamente solo 1 , quindi è un singleton. Tutte le condizioni sono soddisfatte e B verrà replicato per corrispondere alla 3a dimensione di A

In altre lingue, questo è comunemente chiamato trasmissione e avviene automaticamente in Python (numpy) e Octave.

La funzione, @fun , deve essere una funzione binaria che significa che deve prendere esattamente due input.

Osservazioni

Internamente, bsxfun non replica la matrice ed esegue un ciclo efficiente.