Eliminando elementos de matriz por = vs matriz de reasignación

¿Hay alguna diferencia entre estos dos métodos para eliminar elementos en Matlab:

ElementsToDelete = [0 0 1 0 1 0 0 1 1 0] A = 1:10 A(ElementsToDelete) = [] %Versus A = 1:10 A = A(~ElementsToDelete) 

¿Hay momentos en que un método es más apropiado que el otro? ¿Hay alguna diferencia en la eficiencia? ¿O son completamente intercambiables?

Prueba esto:

 A = rand(1e3, 1); b = A<0.5; tic; for ii = 1:1e5 a = A; a(b) = []; end toc tic; for ii = 1:1e5 a = A; a = a(~b); end toc 

Resultados:

 Elapsed time is 1.654146 seconds Elapsed time is 1.126325 seconds 

Entonces, la diferencia es un factor de velocidad de 1.5 a favor de la reasignación. Sin embargo, esto es peor:

 A = rand(1e4, 1); stop = 0; for jj = 1:10 a = A; start = tic; for ii = 1:1e5 a(a < rand) = []; end stop = stop + toc(start); end avg1 = stop/10 stop = 0; for jj = 1:10 a = A; start = tic; for ii = 1:1e5 a = a(a > rand); end stop = stop + toc(start); end avg2 = stop/10 avg1/avg2 

Resultados:

 avg1 = 1.1740235 seconds avg2 = 0.1850463 seconds avg1/avg2 = 6.344485136963019 

Entonces, el factor aumentó a más de 6.

Mi suposición es que la eliminación (es decir, la asignación con [] ) vuelve a escribir la matriz completa en cada ocurrencia de un true en el ciclo interno a través de los índices lógicos. Esto es irremediablemente ineficiente, como se pone de manifiesto al probarlo así. La reasignación por otro lado puede determinar el tamaño de la nueva matriz de antemano e inicializarla en consecuencia; no es necesario volver a escribir.

Por qué el JIT no comstack el uno con el otro es un misterio para mí, porque la eliminación es una notación mucho más intuitiva en mi humilde opinión. Pero, como puede ver, es ineficiente en comparación con las alternativas y, por lo tanto, debe usarse con moderación. ¡Nunca lo use dentro de los bucles!