Matlab - Reducir tiempo ejecucion matrices

   
Vista:

Reducir tiempo ejecucion matrices

Publicado por García (40 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
1
N(1:10,1:10,1:10)=100;
. 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.


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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO

Reducir tiempo ejecucion matrices

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3432 intervenciones) el 28/12/2014 12:37:05
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
>> clear all; R=rand(3,7,2), p=0.45; R(R(:,:,:)<=p)=1,  R(R(:,:,:)~=1)=0
 
R(:,:,1) =
 
    0.9991    0.5612    0.1904    0.9816    0.6448    0.4283    0.5895
    0.1711    0.8819    0.3689    0.1564    0.3763    0.4820    0.2262
    0.0326    0.6692    0.4607    0.8555    0.1909    0.1206    0.3846
 
 
R(:,:,2) =
 
    0.5830    0.6171    0.9827    0.5841    0.8797    0.5944    0.3127
    0.2518    0.2653    0.7302    0.1078    0.8178    0.0225    0.1615
    0.2904    0.8244    0.3439    0.9063    0.2607    0.4253    0.1788
 
 
R(:,:,1) =
 
    0.9991    0.5612    1.0000    0.9816    0.6448    1.0000    0.5895
    1.0000    0.8819    1.0000    1.0000    1.0000    0.4820    1.0000
    1.0000    0.6692    0.4607    0.8555    1.0000    1.0000    1.0000
 
 
R(:,:,2) =
 
    0.5830    0.6171    0.9827    0.5841    0.8797    0.5944    1.0000
    1.0000    1.0000    0.7302    1.0000    0.8178    1.0000    1.0000
    1.0000    0.8244    1.0000    0.9063    1.0000    1.0000    1.0000
 
 
R(:,:,1) =
 
     0     0     1     0     0     1     0
     1     0     1     1     1     0     1
     1     0     0     0     1     1     1
 
 
R(:,:,2) =
 
     0     0     0     0     0     0     1
     1     1     0     1     0     1     1
     1     0     1     0     1     1     1



Saludos.
JOSE JEREMÍAS CABALLERO
Asesoría online
programador en matlab
Servicios de programación matlab
jjcc94@hotmail.com
Estimado Usuario de Matlab, el correo es para servicios de cursos, asesoría y programación. Toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com

http://www.lawebdelprogramador.com/foros/Matlab/1371532-FORMA_DE_APRENDER_MATLAB.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Reducir tiempo ejecucion matrices

Publicado por García (40 intervenciones) el 29/12/2014 06:49:47
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar