Matlab - consider preallocating for speed

 
Vista:
Imágen de perfil de Paula Andrea

consider preallocating for speed

Publicado por Paula Andrea (2 intervenciones) el 23/08/2014 17:38:22
Hola a todos, estaba trando de correr este programa en Matlab y me aparece para C2:: the variable "C1" appears to change size on every loop iteration (within a script). Consider preallocating for speed.

Muchas gracias si me pueden colaborar con este trabajo para la Universidad :)

%Metodo de A PK-PD para sistemas de cancer
%Parametros del modelo
%Farmaco CPT-11
clear
d=45; %dosis del farmaco
v1=4.85; %volumen de distribucion
v2=42.9; %volumen de distribucion 2
A10=0.553; %procesos de eliminacion
A12=0.015; %constante de velocidad
A21=0.0616; %constante de velocidad
C1(1)=10; %concentracion de farmaco en plasma
%Farmaco 5 FU
D=50; %dosis del farmaco
v1B=0.71; %volumen de distribucion
v2B=0.25; %volumen de distribucion 2
A10B=6.30; %procesos de eliminacion
A12B=0.234; %constante de velocidad
A21B=0.0964; %constante de velocidad
C2(1)=10; %sitio del tumor

h=0.1; %paso numerico
tmax=10;
kmax=tmax/h;
for k=1:kmax
C1(k+1)=(A21*C2(k*h)*(v1/v2)-A12*C1(k*h)-A10*C1(k*h)+((d(k*h))/v1))*h+C1(k*h);
C2(k+1)=(A12B*C1(k*h)*(v1B/v2B)-A21B*C2(k*h))*h+C2(k*h);
end
t=[0:h:tmax];
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

consider preallocating for speed

Publicado por Capitan Kirk (16 intervenciones) el 25/08/2014 08:31:05
Creo que es un simple aviso. Haces C1(1)=10, luego el vector C tiene un solo elemento. Luego, durante la ejecución del bucle, estás utilizando posiciones sucesivas del vector C1 que, en principio, no existen. Por tanto, el sistema tiene que recalcular y reasignar el espacio necesario para el vector en cada iteración del bucle, y eso requiere tiempo. Lo mismo ocurre con el vector C2. Eso es lo que te está indicando. La solución es simple: Calcula primero el valor de kmax, y luego dimensiona los vectores C1 y C2 a (kmax+1) elementos, antes de entrar en el bucle de cálculos.

También deberías tener en cuenta, al calcular kmax, cómo redondear a entero en el caso de que tmax/h no sea un número entero.

Saludos,
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
sin imagen de perfil

consider preallocating for speed

Publicado por carlos (4 intervenciones) el 28/08/2014 20:03:32
Para que no te aparezca ese errer antes de for debes darle un tamaño a C1 Y C2 asi
C1=zeros(kmax,1)
C2=zeros(kmax,1)
y dentro ddel for debe ser asi:
for k=1:kmax
C1(k+1,1)=(A21*C2(k*h)*(v1/v2)-A12*C1(k*h)-A10*C1(k*h)+((d(k*h))/v1))*h+C1(k*h);
C2(k+1,1)=(A12B*C1(k*h)*(v1B/v2B)-A21B*C2(k*h))*h+C2(k*h);
end

se supome con esto se solucina esre error
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
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

consider preallocating for speed

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 02/01/2015 12:19:32
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
clear all
 d=45; %dosis del farmaco
 v1=4.85; %volumen de distribucion
 v2=42.9; %volumen de distribucion 2
 A10=0.553; %procesos de eliminacion
 A12=0.015; %constante de velocidad
 A21=0.0616; %constante de velocidad
 C1(1)=10; %concentracion de farmaco en plasma
 %Farmaco 5 FU
 D=50; %dosis del farmaco
 v1B=0.71; %volumen de distribucion
 v2B=0.25; %volumen de distribucion 2
 A10B=6.30; %procesos de eliminacion
 A12B=0.234; %constante de velocidad
 A21B=0.0964; %constante de velocidad
 C2(1)=10; %sitio del tumor
 
 h=0.1; %paso numerico
 tmax=1;
 kmax=tmax/h;
 for k=1:kmax
 C1(k+1)=(A21*C2(k)*h*(v1/v2)-A12*C1(k)*h-A10*C1(k)*h+((h*d)/v1))*h+h*C1(k);
 C2(k+1)=(A12B*h*C1(k)*(v1B/v2B)-A21B*h*C2(k))*h+h*C2(k);
 end
 t=[0:h:tmax];
 C1
 C2
 
C1 =
 
   10.0000    1.0367    0.1906    0.1108    0.1032    0.1025    0.1025    0.1024    0.1024    0.1024    0.1024
 
 
C2 =
 
   10.0000    1.0568    0.1116    0.0123    0.0020    0.0009    0.0008    0.0008    0.0008    0.0008    0.0008



Saludos.
JOSE JEREMÍAS CABALLERO
Asesoría online
programador en matlab
Servicios de programación matlab
[email protected]
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
0
Comentar