
Reducir tiempo ejecucion matrices
Publicado por García (42 intervenciones) el 27/12/2014 20:46:11
Tengo claro como se utilizan la forma vectorizada en una matriz 3D cuando se rellena dicha matriz con una constante en lugar de utilizar los bucles for. Por ejemplo . Sin embargo, cuando hay que incluir algún bucle o constantes que van incrementándose ya no tengo claro cual sería la forma más eficiente de hacerlo de forma que se utilice la forma vectorizada.
A continuación indico una muestra de un posible código para ver si se puede hacer de forma más eficiente.
Muchas gracias.
1
N(1:10,1:10,1:10)=100;
A continuación indico una muestra de un posible código para ver si se puede hacer de forma más eficiente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
I_total=10^(-2);
V=0;
R_superior=20;
R_inferior=20;
nx=10;
ny=20;
nz=30;
L=20*10^(-9);
l=L/nz;
R = (rand(nx,ny,nz));
p=0.45; % probabilidad que puede cambiar
%Dependendiendo del número aleatorio generado y la probabilidad pasada
%como argumento la matriz se irá rellenando con ceros o unos.
for i=1:size(R,1)
for j=1:size(R,2)
for k=1:size(R,3)
if R(i,j,k)<=p
R(i,j,k)=1; % Si el contenido de la matriz es menor o igual
% que la probabilidad rellenamos con 1
else
R(i,j,k)=0; % Si es contenido de cada posición de la matriz
% es mayor que p con 0
end
end
end
end
D=(1:size(R,2)); % Vector para guardar el número de ceros por columna
%Inicializamos variable.
contador_huecos=0;
for k=1:size(R,3)
for j=1:size(R,2) %Vamos mirando todos los elementos
for i=1:size(R,1)
if R(i,j,k)==0 %1
contador_huecos = contador_huecos + 1;
end %1
end % for j
D(k,j)=contador_huecos;
contador_huecos = 0; %reiniciamos el contador de ceros para contar en la siguiente fila
end % for i
end %for k
%Recorremos todas las posiciones de la matriz 3D
for k=1:size(R,3)
for j=1:size(R,2)
for i=1:size(R,1)
%Si hay un hueco se calcula el campo electrico en ese punto.
if R(i,j,k)==0
E(i,j,k)=((abs(V)-I_total*(R_superior+R_inferior))/(D(k,j)*l));
else
%El campo electrico será cero en las posiciones donde haya
%unos, ya que representan las trampas, y donde haya trampas
%no hay campo electrico.
E(i,j,k)=0;
end
end
end
end
Muchas gracias.
Valora esta pregunta


0