2012-09-28 11 views
6

Tengo este siguiente ciclo para un código (que calcula los histogramas). Estoy escribiendo en Matlab. Como soy nuevo en Matlab, no conozco ningún método más rápido para hacer esto. Actualmente estoy escribiendooptimización de matlab para el ciclo

for i=1:size(b) 
    a(b(i)) = a(b(i)) + 1; 
end 

¿Hay algún método más rápido para hacerlo, preferiblemente aquellos que no requieren el ciclo for?

+2

Observación general: 'size' no es la función correcta para lo que está haciendo ahora, en lugar utiliza [longitud] (http://www.mathworks.nl/help/matlab/ref/length.html) o [numel] (http://www.mathworks.nl/help/matlab/ref/numel.html). –

+2

La idea de que los bucles for-loops son ineficientes/lentos y deben ser reemplazados si es posible no está comprobada. Aunque podría reemplazar este código por algo más rápido, probablemente ahorre solo una fracción de segundo. Este no es el nivel de optimización del código que debería preocuparle. – Kavka

+0

@Kavka Con respecto a este tipo de bucle, estoy de acuerdo. Un bucle for más complejo que manipule matrices grandes valdría la pena vectorizar, ¿verdad? Matlab fue diseñado para trabajar con Matrices, se supone que todas sus operaciones matriciales están optimizadas. – Derek

Respuesta

9

Puede simplemente vectorizarlo por a(b) = a(b) + 1. Compruebe lo siguiente:

>> a = [1 2 3 4]; 
>> b = [2 4]; %# indices to modify. Be sure that they are in bounds. 
>> a(b) = a(b) + 1 

a = 

    1  3  3  5 

Si utiliza algunos índices múltiples veces, y luego accumarray ayudará de la siguiente manera:

>> a = [1 2 3 4]; 
>> b = [2 4 2]; 
>> a = accumarray([1:numel(a) b].',[a ones(size(b))])' 

a = 

    1  4  3  5 

Como alternativa, puede utilizar:

>> a = [1 2 3 4]; 
>> b = [2 4 2]; 
>> b = accumarray(b.',ones(size(b))); 
>> a(nzIndex) = a(nzIndex) + b(nzIndex)' 

a = 

    1  4  3  5 

Ver this nice answer aquí para más detalles.

+0

En mi caso b puede ser [2 4 2], por lo que necesito incrementar un (2) dos veces. Este método actualiza a (2) solo una vez. – anirudh

+0

He actualizado la pregunta en consecuencia. – petrichor

1

Si ambos a y b son vectoriales, esto debería funcionar.

a = 1:100; 
b = 100:-1:1; 

a(b) = a(b) + 1; 
Cuestiones relacionadas