Matlab - Llamar variable iterativamente

 
Vista:
sin imagen de perfil

Llamar variable iterativamente

Publicado por Miguel (6 intervenciones) el 10/07/2017 10:43:46
Mi duda es si con el siguiente código se puede lograr lo que me propongo, o si habría alguna otra forma de hacerlo.

1
2
3
4
5
6
A=[0 1 2 3;...
    4 5 6 7;...
    8 9 10 11];
a12=3;
m=1;
amA(13)

He eliminado los bucles for que controlaban el valor de m y del interior de la matriz para simplificar el código.

Espero sus respuestas y muchas gracias por su ayuda.
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 JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Llamar variable iterativamente

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 10/07/2017 16:32:58
qué es realmente lo que deseas hacer?, qué es lo que te propones?

cuáles variables quieres llamar iterativamente?
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

Llamar variable iterativamente

Publicado por Miguel (6 intervenciones) el 10/07/2017 17:49:41
Quizás resumirlo no haya sido la mejor idea. A ver, os explico, estoy tratando de hacer un mecanismo de 1 GDL. Las matrices S, son las coordenadas iniciales de los puntos. Algunas vienen definidas por anclajes, otras por ecuaciones de sólido rígido y otras son coincidentes.

En este programa trato de hacerle entender a Matlab cuales de ellas son coincidentes y en que puntos mediante la matriz A. La fila de entrada indica el elemento del que se trata, el número en el interior de la fila corresponde al punto de conexión de dicho punto y la columna representa el sólido al que se une. Para agilizar el código se utiliza diagonalmente intercambiando fila columna.

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
S1=[x11 y11; x12 y12; x13 y13];
S2=[x21 y21; x22 y22];
S3=[x31 y31; x32 y32; x33 y33];
S4=[x41 y41; x42 y42];
 
M=[S1;S2;S3;S4];
 
A=[ 0 3 0 0;...
    1 0 2 0;...
    0 1 0 2;...
    0 0 1 0];
 
for m=1 : 4
    for n=m+1 : 4
        if A(m,n)~=0 && A(n,m)~=0
           Sm(A(m,n),1)=Sn(A(n,m),1);
           Sm(A(m,n),2)=Sn(A(n,m),2);
        elseif A(m,n)~=0 && A(n,m)==0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        elseif A(m,n)==0 && A(n,m)~=0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        end
    end
end

La cuestión esta en esos Sn y Sm de las lineas 16 y 17. Para que según los valores de m y n, estos puedan acceder a la matriz del sólido correspondiente.
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 JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Llamar variable iterativamente

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 10/07/2017 17:57:20
ah bueno, entonces se utiliza eval

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
S1=[x11 y11; x12 y12; x13 y13];
S2=[x21 y21; x22 y22];
S3=[x31 y31; x32 y32; x33 y33];
S4=[x41 y41; x42 y42];
M=[S1;S2;S3;S4];
 A=[ 0 3 0 0;...
    1 0 2 0;...
    0 1 0 2;...
    0 0 1 0];
 for m=1 : 4
    for n=m+1 : 4
        if A(m,n)~=0 && A(n,m)~=0
           eval(['S' num2str(m) '(A(m,n),1)=S' num2str(n) '(A(n,m),1)']);
           eval(['S' num2str(m) '(A(m,n),2)=S' num2str(n) '(A(n,m),2)']);
        elseif A(m,n)~=0 && A(n,m)==0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        elseif A(m,n)==0 && A(n,m)~=0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        end
    end
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Llamar variable iterativamente

Publicado por Miguel (6 intervenciones) el 10/07/2017 18:31:49
Me da un error. Aunque creo que es por el código y no por el eval.

"The expression to the left of the equals sign is not a valid target for an assignment."
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 JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Llamar variable iterativamente

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 10/07/2017 18:52:33
si, el problema es del código en la definición de tus variables si deseas adjunta el código completo para poderlo ejecutar
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

Llamar variable iterativamente

Publicado por Miguel (6 intervenciones) el 10/07/2017 19:31:33
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
x11=0; y11=0; x12=131.072 ;y12=15.053; x13=48.32; y13=-24.317;
x31=83.62; y31=-28.562; x32=94.036; y32=-11.579; x33=118.341; y33=-20.843;
x42=120.367; y42=45.16;
 
S1=[x11 y11; x12 y12; x13 y13];
S2=[x21 y21; x22 y22];
S3=[x31 y31; x32 y32; x33 y33];
S4=[x41 y41; x42 y42];
M=[S1;S2;S3;S4];
 A=[ 0 3 0 0;...
    1 0 2 0;...
    0 1 0 2;...
    0 0 1 0];
 for m=1 : 4
    for n=m+1 : 4
        if A(m,n)~=0 && A(n,m)~=0
           eval(['S' num2str(m) '(A(m,n),1)=S' num2str(n) '(A(n,m),1)']);
           eval(['S' num2str(m) '(A(m,n),2)=S' num2str(n) '(A(n,m),2)']);
        elseif A(m,n)~=0 && A(n,m)==0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        elseif A(m,n)==0 && A(n,m)~=0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        end
    end
end

Las varables que faltan en el código, x21, y21, x22, y22, x41, y41, es porque son las coincidentes.
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 JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Llamar variable iterativamente

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 10/07/2017 19:41:26
debes agregar todas las funciones y archivos necesarios de tal forma que yo pueda ejecutar tu código, de lo contrario me va a dar un error en estos momentos :

Undefined function or variable 'x21'.

la idea es poderlo ejecutar para ayudarte
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

Llamar variable iterativamente

Publicado por Miguel (6 intervenciones) el 11/07/2017 17:35:27
Perdonad, lo hemos estado intentando hasta la saciedad. La única solución mínimamente viable es darle valor 0, pero sigue dando el mismo error. Aún así.

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
x11=0; y11=0; x12=131.072 ;y12=15.053; x13=48.32; y13=-24.317;
x21=0; y21=0; x22=0; y22=0;
x31=83.62; y31=-28.562; x32=94.036; y32=-11.579; x33=118.341; y33=-20.843;
x41=0; y41=0; x42=120.367; y42=45.16;
 
S1=[x11 y11; x12 y12; x13 y13];
S2=[x21 y21; x22 y22];
S3=[x31 y31; x32 y32; x33 y33];
S4=[x41 y41; x42 y42];
M=[S1;S2;S3;S4];
 A=[ 0 3 0 0;...
    1 0 2 0;...
    0 1 0 2;...
    0 0 1 0];
 for m=1 : 4
    for n=m+1 : 4
        if A(m,n)~=0 && A(n,m)~=0
           eval(['S' num2str(m) '(A(m,n),1)=S' num2str(n) '(A(n,m),1)']);
           eval(['S' num2str(m) '(A(m,n),2)=S' num2str(n) '(A(n,m),2)']);
        elseif A(m,n)~=0 && A(n,m)==0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        elseif A(m,n)==0 && A(n,m)~=0
            fprintf('Te has equivocado, comprueba la fila %d y columna %d o la fila %d y columna %d.\n',m,n,n,m);
            stop;
        end
    end
end

Muchísimas gracias por la ayuda.
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 JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Llamar variable iterativamente

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 11/07/2017 18:05:23
Ejecuto el código que has puesto últimamente y no me da ningún tipo de error , estos son los valores que obtengo de S1 S2 S3 Y S4 :

S1 =

0 0
131.0720 15.0530
0 0

>> S2

S2 =

0 0
83.6200 -28.5620

>> S3

S3 =

83.6200 -28.5620
0 0
118.3410 -20.8430

>> S4

S4 =

0 0
120.3670 45.1600
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

Llamar variable iterativamente

Publicado por Miguel (6 intervenciones) el 11/07/2017 18:08:52
Vale, pero tiene que ser justo del revés, los valores 0 tienen que cambiarse por los numéricos aportados.
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 JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Llamar variable iterativamente

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 11/07/2017 19:35:29
no has programado bien el algoritmo , ya que no corresponde a lo que indicas en tu último mensaje

si lo que deseas es cambiar los ceros de las matrices originales de S1 a S4 si es así cómo explican los números en A por qué números se deben sustituir esos ceros???? Puedes poner un ejemplo manualmente y con las salidas que deseas obtener en la parte final de tu programa
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