Eliminar cuatro bucles anidados en Matlab
Tengo los siguientes cuatro bucles anidados en Matlab:
timesteps = 5;
inputsize = 10;
additionalinputsize = 3;
outputsize = 7;
input = randn(timesteps, inputsize);
additionalinput = randn(timesteps, additionalinputsize);
factor = randn(inputsize, additionalinputsize, outputsize);
output = zeros(timesteps,outputsize);
for t=1:timesteps
for i=1:inputsize
for o=1:outputsize
for a=1:additionalinputsize
output(t,o) = output(t,o) + factor(i,a,o) * input(t,i) * additionalinput(t,a);
end
end
end
end
Hay tres vectores: un vector de entrada, un vector de entrada adicional y un vector de salida. Todos están conectados por factores. Cada vector tiene valores en pasos de tiempo dados. Necesito la suma de todas las entradas combinadas, entradas adicionales y factores en cada paso de tiempo dado. Más tarde, necesito calcular de la salida a la entrada:
result2 = zeros(timesteps,inputsize);
for t=1:timesteps
for i=1:inputsize
for o=1:outputsize
for a=1:additionalinputsize
result2(t,i) = result2(t,i) + factor(i,a,o) * output(t,o) * additionalinput(t,a);
end
end
end
end
En un tercer caso, necesito el producto de los tres vectores sumados en cada paso de tiempo:
product = zeros(inputsize,additionalinputsize,outputsize)
for t=1:timesteps
for i=1:inputsize
for o=1:outputsize
for a=1:additionalinputsize
product(i,a,o) = product(i,a,o) + input(t,i) * output(t,o) * additionalinput(,t,a);
end
end
end
end
Los dos fragmentos de código funcionan pero son increíblemente lentos. ¿Cómo puedo eliminar los bucles anidados?
Editar: valores agregados y cambios menores para que los fragmentos sean ejecutables
Edit2: se agregó otro caso de uso