Matlab - Bucle Matlab

 
Vista:

Bucle Matlab

Publicado por Rubén (7 intervenciones) el 07/06/2019 16:02:14
Buenas tardes,

Tengo una duda , quiero crear un bucle donde almacenar unas coordenadas x e y que genero aleatoria mente, quiero poner una restricción para almacenar solo las que la cumplan.

Por ejemplo:

Crear 10 círculos de radio 1. quiero crear las posiciones x e y aleatoria mente y comprobar que la distancia entre los centros de los círculos es mayor al radio, si cumple esa condición quiero guardar los valores en una matriz [10,2]. lo que no se es como ir guardando los valores en la matriz, ¿Alguna sugerencia?

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
sin imagen de perfil
Val: 918
Bronce
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Bucle Matlab

Publicado por Daniel (354 intervenciones) el 09/06/2019 12:54:22
Hola,

Es una operación básica, solamente hay que utilizar el operador dos puntos para seleccionar los elementos de una matriz. Una posible implementación del problema seria.

1
2
3
4
5
6
7
8
9
10
11
resultados = zeros(10, 2);
pos = 0;
 
while pos < 10
    punto = rand(1, 2);
 
    if true % Reemplza true por la condición.
        pos = pos + 1;
        resultados(pos, :) = punto;
    end
end

En un bucle se generan los números aleatorios hasta que se tengan los 10, solamente hay que cambiar true por la condición.

Saludos,
Daniel Rodríguez.
Analytics Lane
Matlab en Analytics Lane
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

Bucle Matlab

Publicado por Rubén (7 intervenciones) el 10/06/2019 10:21:55
Buenas,

Muchas gracias. Y si tambien quiero restar posiciones esto sería valido?

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
for i=1:N
 
    coord.X=rand(1); %posicion random para la coordenada X
 
    coord.Y=rand(1); %posicion random para la coordenada Y
 
    posiciones(i,:) = [coord.X, coord.Y]
 
 
 
%compruebo distancias entre centros para que no se corten los circulos
 
    if i ~= 1 %en el primer circulo no lo compruebo porque solo hay un circulo
 
        for i=2:N
 
            dist=sqrt ( (coord.X(i)-coord.X(i-1))^2 + (coord.Y(i)-coord.Y(i-1))^2); %distancia entre centros de fibras
 
                if dist>R %si es mayor, no se cortan, el circulo es bueno
 
                    %guardo este circulo en una matriz con sus coordenadas
                    posiciones(i,:) = [coord.X,coord.Y];
 
                else
                    i = i-1;
            end
        end
   end
 
end


Es que me da error...

Un saludo.
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
Val: 918
Bronce
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Bucle Matlab

Publicado por Daniel (354 intervenciones) el 11/06/2019 18:31:51
Hola,

Pues normal, tienes un bucle for anidado con la misma variable.

El problema se puede resolver de una mantera más sencilla con pdist una función que calcula la distancia entre todos los puntos de una matriz. Sigue los comentarios del código para como se puede resolver el programa en cuatro líneas.

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
% Se crea el primer punto
resultados = rand(1, 2);
 
% Se define el radio
R = 0.5;
 
% Número de puntos
N = 4;
 
% Se itera mientras se tenga menos de N resultados
while size(resultados, 1) < N
    % Se agrega un nuevo punto al vector temporal
    nuevopunto = [resultados; rand(1, 2)];
 
    % Si la distancia minima entre dos puntos
    % es menor que R se añade el punto
    if min(pdist(nuevopunto)) > R
        resultados = nuevopunto;
    end
end
 
% La matriz de distancias es
squareform(pdist(resultados))
 
% Los puntos son
resultados

Si ejecutas el programa podrás ver que ninguna de las distancias es mayor que el limite marcado en R. Aunque hay que tener cuidad, si R es grande puede que nunca termine el programa si llenas todo el espacio.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ans =
 
         0    0.6221    0.5870    0.7091
    0.6221         0    0.5988    0.5009
    0.5870    0.5988         0    1.0164
    0.7091    0.5009    1.0164         0
 
 
resultados =
 
    0.3506    0.3320
    0.5560    0.9192
    0.9259    0.4483
    0.0586    0.9782

Cambia N por el número de puntos que quieras, he usado 4 para que se pueda ver en pantalla.

Saludos,
Daniel Rodríguez.
Analytics Lane
Matlab en Analytics Lane
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

Bucle Matlab

Publicado por Rubén (7 intervenciones) el 11/06/2019 20:24:55
Muchas gracias, creo que era justo lo que necesitaba. Ahora a ver si soy capaz de rellenar de negro los circulos con la funcion viscircles.

Un saludo.
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