Matlab - como hago sentencia "GOTO" ?

 
Vista:

como hago sentencia "GOTO" ?

Publicado por Alvaro (3 intervenciones) el 24/04/2011 04:19:45
Hola a todos,

Mi conslta es sobre como generar una sentencia del tipo "GOTO" en Matlab 6.5, ya que no la tiene.

Miré entre varios libros, pero solo explican las sentencias mas comunes como "for", "if", etc.

Lo que debo hacer es ir sacando numeros de una matriz de forma aleatoria, y a esas posiciones de la matriz cada vez que saco el numero lo reemplazo por un cero.

El problema es cuando el proceso aleatorio cáe justo en una posicion pasada en donde ya puse un cero, eso es lo que no quiero que haga.

Si tubiera un "go to" , vuelvo a ejecutar la linea que elegi de forma aleatoria la posicion, y de esta forma repito hasta que no sea justo un cero.

En fín, si alguien podria explicarme como genero un GO TO, agradezco de antemano!
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
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

como hago sentencia

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 24/04/2011 06:05:22
Hola Alvaro.
Derepente este programa te ayude, a lo que quieres hacer.
Genero una matriz aleatoria 'a' cuadrada, luego cada elemento de la matriz 'a' lo guardo en el matriz 'b' en forma aleatoria esto quiere decir, que todo los elementos de la matriz 'a' se guarda en 'b', en lugares aleatorias. el programa se llama matrizgoto.m por eso cuando ejecuto el programa lo llamo con el nombre matrizgoto

%===========================
clear,clc
a=rand(3,3);
display(a);
[n,m]=size(a);
b=zeros(n,m);
display(b);
k=0;
while 1
i=randperm(n);
j=randperm(n);
if a(i(1),j(1))==0
continue;
end
b(j(1),i(1))=a(i(1),j(1));
a(i(1),j(1))=0;
k=k+1;
if k==n*m
break;
end
end
display('MATRIZ CAMBIADA');
display(b);
display(a);
%====================================

%EJECUCION
>> matrizgoto
a =
0.0348 0.0152 0.8061
0.4151 0.8630 0.9970
0.6636 0.4308 0.2171


b =
0 0 0
0 0 0
0 0 0

MATRIZ CAMBIADA
b =
0.0348 0.4151 0.6636
0.0152 0.8630 0.4308
0.8061 0.9970 0.2171

a =
0 0 0
0 0 0
0 0 0


para mayor ayuda de cada comando que utilizo, puedes digitar en la ventana de comandos de las siguiente forma.
>>help randperm
>> help continue
>>help zeros
>> help display

tendras la ayuda de cada comando de matlab visible.

Saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR EN MATLAB
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

como hago sentencia

Publicado por Alvaro (3 intervenciones) el 24/04/2011 23:17:22
José,

Primero gracias por la pronta respuesta.

Lamentablemente sigo sin solucionarlo, pero para mayor claridad explico bien que es lo que quiero hacer:

Teniendo en un archivo "*.txt" una matriz que representa un mazo de cartas (52 cartas), lo que quiero lograr es ir sacando carta por carta de forma aleatoria hasta agotar el mazo.

Cada vez que saco una carta detrminada ese lugar en la matriz lo podria llenar con un cero, que representaria la ausencia de esa carta, es decir, no puede sacarse otra vez una carta que ya se ha sustraido.

El archivo que contiene la matris se llama "deck" es el suiguiente:

1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10

es decir, 13 cartas por cada "suit".

La matriz no es cuadrada como en tu programa, y no me doy cuenta como adaptarlo a mi caso.

Dos opciones, o bien mezclo el mazo y saco cartas en una secuencia ordenada, o bien dejo el mazo ordenado y saco cartas de forma aleatoria.

El problema es que el "rand" puede caer dos veces en la misma carta.

Yo preguntaba por "go to" porque con esa sentencia junto con un "IF" hago al programa ver si eligió un cero, entonces lo hago volver a elegir, hasta que encuentre una que no haya sacado aún.

Aca dejo el programa que saca 20 cartas, es muy sensillo:

-----------------------------------------------------------------
clc
% carga el o los mazos en la variable "deck"
deck=textread('deck.txt');
[f, c]=size(deck);
f*c;

%sacar 20 cartas
i=0;
for n=1:20

a=round((4-1)*rand+1); %toma una fila al azar del 1 al 4
b=round((13-1)*rand+1); % toma una columna al azar del 1 al 13

%aca iria la sentencia que verifica si la carta
%ha sido elegido elegida previamente


carta=deck(a,b) %muestra la carta elegida
deck(a,b)=0; %pone un cero en la posicion elegida

i=i+1;
end
i
--------------------------------------------------------------------
cualquier ayuda es buena
saludos y 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
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

como hago sentencia

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 25/04/2011 00:49:41
Hola Alvaro.
Hice unos arreglos a tu programa. Me parece que quieres algo asi. Si no es asi, vuelves a escribir y lo modifico. Ah el programa es para sacar una cantidad arbitraria de cartas, por eso te pide que ingreses por el teclado la cantidad de cartas a sacar, obviamente no puede ser mayor que todas las cartas que tienes en el archivo de texto matrizgoto1.txt.
El programa se llama matrizgoto1.m por eso cuando lo ejecuto lo llamo con el nombre de matrizgoto1

%============================================
clear,
n=input('Ingrese la cantida de cartas a sacar n:');
deck=importdata('matrizgoto1.txt');
display(deck);
[fil,col]=size(deck);
for i=1:n

a=round((fil-1)*rand+1);
b=round((col-1)*rand+1); %deck(a,b);
if deck(a,b)==0
continue
end

fprintf(' i=%2d carta=%2d\n',i,deck(a,b));
deck(a,b)=0;

end
display(deck);
%=====================================

%EJECUCION EN LA VENTANA DE COMANDOS
>> matrizgoto1
Ingrese la cantida de cartas a sacar n:5
deck =
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10

i= 1 d carta= 6
i= 2 d carta=10
i= 3 d carta= 9
i= 4 d carta= 1
i= 5 d carta= 8
deck =
0 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 0 9 10 10 0 10
1 2 3 4 5 0 7 8 0 10 10 10 10

>> matrizgoto1
Ingrese la cantida de cartas a sacar n:10
deck =
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10

i= 1 d carta=10
i= 2 d carta= 7
i= 3 d carta=10
i= 4 d carta= 1
i= 6 d carta=10
i= 7 d carta= 4
i= 8 d carta= 5
i= 9 d carta= 9
i=10 d carta= 4
deck =
1 2 3 0 0 6 7 8 9 10 10 0 10
1 2 3 0 5 6 7 8 0 10 10 10 0
0 2 3 4 5 6 0 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 0 10 10 10

Saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR EN MATLAB
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

como hago sentencia

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 25/04/2011 03:41:20
Hola Alvaro.
En programa anteriror lo he mejorado.

%=====================================
clear,
deck=importdata('matrizgoto1.txt');
[fil,col]=size(deck);
n=input('Ingrese la cantidad de cartas a sacar n:');
if n<=fil*col
display(deck);
i=0;
while i<=n-1
f=randperm(fil);
c=randperm(col);
if deck(f(1),c(1))==0
continue;
else
i=i+1;
fprintf(' i=%2d deck(%2d,%2d) carta=%2d\n',i,f(1),c(1),deck(f(1),c(1)));
deck(f(1),c(1))=0;
end
end
display(deck);
else
display('Numero de cartas a sacar excedido');
end

%=========================================

%EJECUCION EN LA VENTANA DE COMANDOS.
>> matrizgoto2
Ingrese la cantidad de cartas a sacar n:10
deck =
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10

i= 1 deck( 3, 6) carta= 6
i= 2 deck( 3,10) carta=10
i= 3 deck( 1, 5) carta= 5
i= 4 deck( 1,10) carta=10
i= 5 deck( 2, 1) carta= 1
i= 6 deck( 4,10) carta=10
i= 7 deck( 2, 6) carta= 6
i= 8 deck( 2,11) carta=10
i= 9 deck( 1,13) carta=10
i=10 deck( 4, 3) carta= 3

deck =
1 2 3 4 0 6 7 8 9 0 10 10 0
0 2 3 4 5 0 7 8 9 10 0 10 10
1 2 3 4 5 0 7 8 9 0 10 10 10
1 2 0 4 5 6 7 8 9 0 10 10 10



>> matrizgoto2
Ingrese la cantidad de cartas a sacar n:52
deck =
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10
1 2 3 4 5 6 7 8 9 10 10 10 10

i= 1 deck( 2,12) carta=10
i= 2 deck( 2, 3) carta= 3
i= 3 deck( 1, 5) carta= 5
i= 4 deck( 4, 7) carta= 7
i= 5 deck( 2, 5) carta= 5
i= 6 deck( 2, 9) carta= 9
i= 7 deck( 2, 4) carta= 4
i= 8 deck( 4,13) carta=10
i= 9 deck( 4, 6) carta= 6
i=10 deck( 1, 1) carta= 1
i=11 deck( 2, 7) carta= 7
i=12 deck( 2,11) carta=10
i=13 deck( 3, 9) carta= 9
i=14 deck( 4, 9) carta= 9
i=15 deck( 3, 6) carta= 6
i=16 deck( 1,12) carta=10
i=17 deck( 4, 3) carta= 3
i=18 deck( 3, 3) carta= 3
i=19 deck( 2, 6) carta= 6
i=20 deck( 1, 7) carta= 7
i=21 deck( 3, 4) carta= 4
i=22 deck( 3, 8) carta= 8
i=23 deck( 1, 6) carta= 6
i=24 deck( 4,12) carta=10
i=25 deck( 3, 7) carta= 7
i=26 deck( 4, 5) carta= 5
i=27 deck( 2, 2) carta= 2
i=28 deck( 4, 2) carta= 2
i=29 deck( 1, 2) carta= 2
i=30 deck( 1, 4) carta= 4
i=31 deck( 4, 4) carta= 4
i=32 deck( 1,11) carta=10
i=33 deck( 2,13) carta=10
i=34 deck( 2,10) carta=10
i=35 deck( 1,13) carta=10
i=36 deck( 1, 9) carta= 9
i=37 deck( 2, 1) carta= 1
i=38 deck( 1, 3) carta= 3
i=39 deck( 3, 1) carta= 1
i=40 deck( 3,13) carta=10
i=41 deck( 2, 8) carta= 8
i=42 deck( 4,10) carta=10
i=43 deck( 4,11) carta=10
i=44 deck( 1,10) carta=10
i=45 deck( 3,10) carta=10
i=46 deck( 3,11) carta=10
i=47 deck( 1, 8) carta= 8
i=48 deck( 3, 5) carta= 5
i=49 deck( 3,12) carta=10
i=50 deck( 4, 8) carta= 8
i=51 deck( 4, 1) carta= 1
i=52 deck( 3, 2) carta= 2

deck =
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0

>> matrizgoto2
Ingrese la cantidad de cartas a sacar n:70
Numero de cartas a sacar excedido


Saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR EN MATLAB
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

como hago sentencia

Publicado por Alvaro (3 intervenciones) el 25/04/2011 07:34:02
José,

El programa mejorado es exactamente lo que yo quería lograr, asi que le agradezco mucho por la ayuda que me ha dado.

Quria también comentarle al paso que , mi intencion con este programa es intentar construir un simulador de Blackjack (este juego de cartas, que tiene una matematica muy interesante de fondo) en donde yo pueda evaluar manos y las diferentes expectativas que prensentan.

Si bien existe una variedad de simuladores comerciales, queria hacer mi propio programa para evaluar cuestiones en particular que estoy necesitando saber.

De nuevo le agradezco y le dejo saludos.

Alvaro
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

como hago sentencia

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 25/04/2011 07:39:29
Ok. Alvaro.
Bueno entonces tu pregunta ya fue resuelto.
Hasta luego.


Saludos.
JOSE JEREMIAS CABALLERO
ASESOR DE PROYECTOS CON MATLAB
PROFESOR DE METODOS NUMERICOS CON MATLAB
PROGRAMADOR EN MATLAB
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

como hago sentencia

Publicado por Irving (1 intervención) el 23/09/2015 07:40:22
Que tal Muy buen día mi nombre es Irving y estoy checando en la página que ayudo a una persona a resolver unas dudas con Matlab, me pasa lo mismo y espero me pueda ayudar si es tan amable, tengo unos programas en papel con extensión .BAS que deseo actualizar a Matlab ya que son algo viejos y no conozco bien los lenguajes de programación apenas comienzo en esto me gusta bastante pero no encuentro la forma de resolverlos.

Si me hace favor de ayudarme le agradecería bastante y si no esta en sus posibilidades de igual forma gracias.

Envió una imagen con el código original en papel y lo que estoy haciendo en Matlab

gracias y saludos quedo a sus amables ordenes.

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
71
72
73
74
75
76
77
78
79
80
81
82
83
% PROGRAMA "CAIR07" CALCULA LOS TIRANTES "Y" Y LAS VELOCIDADES MEDIAS
% U EN LAS DIFERENTES SECCIONES DE UNA RÁPIDA DE PENDIENTE, ANCHO DE
% PLANTILLA Y COEFICIENTE DE RUGOSIDAD CONOCIDOS, CUANDO CIRCULA UN 
% GASTO Qw Y LAS COMPUERTAS ESTÁN TOTALMENTE ABIERTAS, PARA EL CASO DE UNA 
% "RÁPIDA" CON ESTE PROGRAMA SE COMPROBARÁ QUE CON LOS GASTOS ESPECIFICADOS
% SE REQUERIRÁ LA INSTALACIÓN DE AIREADORES Y SE ESCOGERÁ LA UBICACIÓN DEL
% PRIMER AIREADOR.
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
% DATOS INICIALES CONOCIDOS
BA= 25;          % ANCHO DE LA RÁPIDA EN M.
N= 0.012;        % COEF. DE MANNING, EN SEG/M^(1/3)
DZ= 0.2;         % DESNIVEL ENTRE SECCIONES, EN M
DX= 1;           % DISTANCIA ENTRE SECCIONES, EN M
ZC= 28;          % DESNIVEL ENTRE LA CRESTA Y EL PUNTO DE INFLEXIÓN, EN M
LC= 45;          % DIST. ENTRE LA CRESTA Y EL PUNTO DE INFLEXIÓN, EN M
BC= 7;           % ANCHO DE COMPUERTAS, EN M
Q= 530;          % GASTO LÍQUIDO, EN M3/S
 
% CÁLCULOS
 
YC= ((Q/(3*BC))^2/9.810001)^(1/3)
AR= 3*BC*YC
PE= 3*(BC+2*YC)
RC= AR/PE
VC= Q/AR
EC= YC+VC^2/19.62
YU= YC
YD= 0
YY(1)= (YU+YD)/2
AR= BA*YY(1)
PE= BA+2*YY(1)
RY(1)= AR/PE
UY(1)= Q/AR
EY(1)= YY(1)+(UY(1))^2/19.62
UU= (VC+UY(1))/2
RR= ((RC+RY(1))/2)^(2/3)
PF= LC*(UU*N/RR)^2
if abs(EC+ZC-EY(1)-PF)<0.001
    x1=300
end
if (EC+ZC)>(EY(1)+PF)
    x2=280
end
YD= YY(1)
GOTO 150
YU= YY(1)
GOTO 150
for i=2:186
end
YU= 1.2*YY(i-1)
YD= 0.8*YY(i-1)
YY(i)= (YU+YD)/2
AR= BA*YY(i)
PE= BA+2*YY(i)
RY(i)= AR/PE
UY(i)= Q/AR
EY(i)= YY(i)+(UY(i))^2/19.62
UYM= (UY(i)+UY(i-1))/2
RYM= ((RY(i)+RY(i-1))/2)^(2/3)
PF= DX*(UYM*N/RYM)^2
if abs(EY(i-1)+DZ-EY(i)-PF)<0.001 then 480
end
if (EY(i-1)+DZ)>(EY(i)+PF) then 460
end
YD= YY(i)
GOTO 330
YU= YY(i)
GOTO 330
NEXT i
for i= 1:91 step 90
end
for j= i:i+90 step 5
end
PRINT "YY(";j;")=";YY(j),"UY(";j;")=";UY(j)
REM YY(): TIRANTE, EN M
REM UY(): VELOCIDAD HORIZONTAL, EN M/SEG
NEXT j
STOP
NEXT i
PRINT "FIN"
STOP
end

Programa-en-papel
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