2012-12-06 5 views
1

X, Y et z sont des coordonnées représentant la surface. Pour calculer une quantité, appelons-la flux, au point i, j de la surface, j'ai besoin de calculer la contribution de tous les autres points (i0, j0). Pour ce faire j'ai besoin par exemple de connaître cos des angles entre le point i0, j0 et tous les autres points (alpha). Alors toutes les contours de i0, j0 doivent être multipliés sur certaines constantes et ajoutés. zv0 à chaque point i, j est le résultat final nécessaire.Matlab pour la vectorisation en boucle et la mémoire

Je suis arrivé avec un code écrit ci-dessous et il semble être extrêmement inapproprié. Tout d'abord, il ralentit le reste du programme et semble utiliser toute la mémoire disponible. Mon système a une mémoire physique de 4 Go et un fichier d'échange de 12 Go et il manque toujours de mémoire, bien que toutes les tailles de variables ne soient pas plus grandes que 10 Ko. S'il vous plaît aider à accélérer/vectorisation et des problèmes de mémoire.

parfor i0=2:1:length(x00); 
    for j0=2:1:length(y00); 
    zv=red3dfunc(X0,Y0,f,z0,i0,j0,st,ang,nx,ny,nz); 
    zv0=zv0+zv; 
    end 
end 


function[X,Y,z,zv]=red3dfunc(X,Y,f,z,i0,j0,st,ang,Nx,Ny,Nz) 
x1=X(i0,j0); 
y1=Y(i0,j0); 
z1=z(i0,j0); 
alpha=zeros(size(X)); 
betha=zeros(size(X)); 
r=zeros(size(X)); 
XXa=X-x1; 
YYa=Y-y1; 
ZZa=z-z1; 
VEC=((XXa).^2+(YYa).^2+(ZZa).^2).^(1/2); 
VEC(i0,j0)=VEC(i0-1,j0-1); 
XXa=XXa./VEC; 
YYa=YYa./VEC; 
ZZa=ZZa./VEC; 
alpha=-(Nx(i0,j0).*XXa+Ny(i0,j0).*YYa+Nz(i0,j0).*ZZa); 
betha=Nx.*XXa+Ny.*YYa+Nz.*ZZb; 
r=VEC; 
zv=(1/pi)*st^2*ang.*f.*(alpha).*betha./r.^2; 
+0

Quelle est la taille de 'x00' et' y00'? – HerrKaputt

+0

tel que X0 = meshgrid (x00, y00). Si vous avez besoin de chiffres, ils sont au moins 50 – user1364012

Répondre

3

La chose évidente à faire est d'utiliser le produit Kroneker. La fonction matlab est kron (A, B) pour les matrices de dimensions nAxmA et nBxmB. Cette fonction retourne matrice de dimension (nA * nB) x (mA * mB), qui ressemble à quelque chose comme

[a11*B a12*B ... a1mA*B; 
.......................; 
anA1*B ........ anAmA*B] 

Donc, votre problème peut être résolu en introduisant la matrice de ceux que je = ones (taille (X)). Vous serez alors définir votre XXa, YYA, Zza et matricies VEC sans boucle comme

XXa = kron(I,X)-kron(X,I); 
YYa = kron(I,Y)-kron(Y,I); 
ZZa = kron(I,Z)-kron(Z,I); 
VEC=((XXa).^2+(YYa).^2+(ZZa).^2).^(1/2); 

Vous trouverez alors VEC pour tout i0, j0 comme (si vous définissez n et m en tant que composants de taille de X)

VEC((1+n*(i0-1)):(n*i0),(1+m*(j0-1)):(m*j0)) 
+0

réponse solide. Je vais certainement l'essayer – user1364012

+0

J'ai essayé d'utiliser cette approche, dommage que cela fonctionne encore plus lent que pour la boucle – user1364012

+0

Ceci est une sorte de triste. La seule chose que je peux vous recommander est d'utiliser repmat (X, size (X)) au lieu de kron (I, X). Peut-être que cela améliorera un peu la vitesse. – Krivoi

Questions connexes