es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Vectorización de productos tensoriales de Python a Matlab

Estoy en el proceso de convertir algunos códigos de Python a Matlab. Tengo códigos que funcionan y producen los mismos resultados, pero me pregunto si hay una forma de vectorizar algunos de mis bucles for en el código de Matlab, ya que tarda mucho en ejecutarse. X es una matriz Nxd, diff es un tensor NxNxd, kxy es una matriz NxN, gradK es un tensor NxNx2, y sumkxy, dxkxy y obj son todas matrices Nxd.

Aquí está el código original en Python:

python
diff = x[:, None, :] – x[None, :, :] # D_{ij, s}
kxy = np.exp(-np.sum(diff ** 2, axis=-1) / (2 * h ** 2)) / np.power(np.pi * 2.0 * h * h, d / 2) # -1 last dimension K_{ij]
gradK = -diff * kxy[:, :, None] / h ** 2 # N * N * 2
sumkxy = np.sum(kxy, axis=1)
dxkxy = np.sum(gradK, axis=1) # N * 2 sum_{i} d_i K_{ij, s}
obj = np.sum(gradK / sumkxy[None, :, None], axis=1) # N * 2

y aquí está mi código en Matlab inicial con todos los bucles for:

diff = zeros([n,n,d]);
for i = 1:n
    for j = 1:n
        for k = 1:d
            diff(i,j,k) = x(i,k) - x(j,k);
        end
    end
end

kxy = exp(-sum(dif.^2, 3)/(2h^2))/((2pih^2)^(d/2));
sumkxy = sum(kxy,2);
gradK = zeros([n,n,d]);
for i = 1:n
    for j = 1:n
        for k = 1:d
            gradK(i,j,k) = -diff(i,j,k)kxy(i, j)/h^2;
        end
    end
end

dxkxy = squeeze(sum(gradK,2));
a = zeros([n,n,d]);
for i =1:n
    for j = 1:n
        for k = 1:d
            a(i,j,k) = gradK(i,j,k)/sumkxy(i);
        end
    end
end
obj = squeeze(sum(a, 2));

Sé que una forma más rápida de calcular el término kxy es usar el siguiente código:

XY = x*x';
x2= sum(x.^2, 2);
X2e = repmat(x2, 1, n);

H = (X2e + X2e' - 2XY); % calculate pairwise distance
Kxy = exp(-H/(2h^2))/((2pih*h)^(d/2));

Pero luego tengo dificultades para calcular gradK eficientemente sin diff. ¡Cualquier ayuda o sugerencia sería muy apreciada!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que estás buscando una manera de vectorizar tu código de Matlab para que se ejecute más rápido. Ya has identificado una forma de calcular la término kxy de manera más eficiente, y puedes usar el mismo enfoque para calcular gradK también.

    Puedes usar el siguiente código para calcular gradK:
    matlab
    gradK = -(x - x').*Kxy/h^2;

    Esto debería ayudarte a vectorizar tu código y hacer que se ejecute más rápido.

Comments are closed.