Autor Tema: ¿Cómo grafico un vector en matlab?

0 Usuarios y 1 Visitante están viendo este tema.

24 Enero, 2014, 10:56 pm
Leído 8813 veces

AniF

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 122
  • Karma: +0/-0
  • Sexo: Femenino
¡Hola a todos!

Hace rato que estoy tratando de graficar un vector en el espacio, el vector p=(3,4,5) como una flecha que nace en el origen y termina en el punto p pero no encuentro los comandos. ¿Es posible hacer eso? Sé que en el plano eso se realiza con la función compass, ¿pero cuál es su análogo en el espacio?

Muchas gracias,

24 Enero, 2014, 11:09 pm
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Esa es la pregunta del millón de dólares.

Te digo más, lo de los vectores es la razón principal por la cual no uso Matlab.

Igual tiene un comando: quiver.
Buscá información sobre eso.
No conozco otros comandos para dibujar flechas.


24 Enero, 2014, 11:32 pm
Respuesta #2

AniF

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 122
  • Karma: +0/-0
  • Sexo: Femenino
Gracias por el dato argentinator, de algo servirá. Otra duda, dibujar un punto solito es posible?.

24 Enero, 2014, 11:39 pm
Respuesta #3

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Sí. Hacé un círculo de radio pequeñito.  ;D

Si no, con plot:

plot(x, y, '.')

24 Enero, 2014, 11:42 pm
Respuesta #4

AniF

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 122
  • Karma: +0/-0
  • Sexo: Femenino
Gracias, con eso creo que ya me arreglo.  :)

25 Enero, 2014, 01:40 am
Respuesta #5

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,447
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Como dijo argentinator, para dibujar una flecha de \( \texttt{P0=(x0,y0,z0)} \) a \( \texttt{P1=(x1,y1,z1)} \) se hace con

\( \texttt{quiver3(x0,y0,z0,x1-x0,y1-y0,z1-z0)} \)

Si la cabeza de la flecha queda muy grande o muy pequeña, o quieres que la línea se vea más gruesa o más fina, puedes controlarlo con

\( \texttt{quiver3(x0,y0,z0,x1-x0,y1-y0,z1-z0,'linewidth',3,'MaxHeadSize',0.1)} \)

Yo usé Octave para probar estos comandos, que es software libre (hace unos meses que me pasé para Linux), pero es compatible con Matlab así que seguramente te funcione.

Las propiedades que puedes personalizar están listadas aquí.
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

25 Enero, 2014, 03:41 am
Respuesta #6

AniF

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 122
  • Karma: +0/-0
  • Sexo: Femenino
Hola Pablo. Ya probé con

\( \texttt{quiver3(x0,y0,z0,x1-x0,y1-y0,z1-z0)} \)

es un comando que no conocía pero sí tienes razón hace demasiado grande la flecha. Intenté insertar

\( \texttt{quiver3(x0,y0,z0,x1-x0,y1-y0,z1-z0,'linewidth',3,'MaxHeadSize',0.1)} \)

pero me parece el siguiente error

>> quiver3(0,0,0,3,5,8,'linewidth',3,'MaxHeadSize',0.1)
?? ? Error using ==> quiver3
Too many input arguments.


¿A qué puede deberse? Muchas gracias por las recomendaciones.

25 Enero, 2014, 06:53 am
Respuesta #7

Juan Pablo Sancho

  • Moderador Global
  • Mensajes: 6,562
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
PabloN mira el Scilab  a ver si te gusta.

25 Enero, 2014, 08:12 am
Respuesta #8

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,447
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hola Pablo. Ya probé con

\( \texttt{quiver3(x0,y0,z0,x1-x0,y1-y0,z1-z0)} \)

es un comando que no conocía pero sí tienes razón hace demasiado grande la flecha. Intenté insertar

\( \texttt{quiver3(x0,y0,z0,x1-x0,y1-y0,z1-z0,'linewidth',3,'MaxHeadSize',0.1)} \)

pero me parece el siguiente error

>> quiver3(0,0,0,3,5,8,'linewidth',3,'MaxHeadSize',0.1)
?? ? Error using ==> quiver3
Too many input arguments.


¿A qué puede deberse? Muchas gracias por las recomendaciones.

A que esas opciones no están disponibles en Matlab, son de Octave. Usa este script:

function adjust_quiver_arrowhead_size(quivergroup_handle, scaling_factor)
% Make quiver arrowheads bigger or smaller.
%
% adjust_quiver_arrowhead_size(quivergroup_handle, scaling_factor)
%
% Example:
%   h = quiver(1:100, 1:100, randn(100, 100), randn(100, 100));
%   adjust_quiver_arrowhead_size(h, 1.5);   % Makes all arrowheads 50% bigger.
%
% Inputs:
%   quivergroup_handle      Handle returned by "quiver" command.
%   scaling_factor          Factor by which to shrink/grow arrowheads.
%
% Output: none

% Kevin J. Delaney
% December 21, 2011
% BMT Scientific Marine Services (www.scimar.com)

if ~exist('quivergroup_handle', 'var')
    help(mfilename);
    return
end

if isempty(quivergroup_handle) || any(~ishandle(quivergroup_handle))
    errordlg('Input "quivergroup_handle" is empty or contains invalid handles.', ...
             mfilename);
    return
end

if length(quivergroup_handle) > 1
    errordlg('Expected "quivergroup_handle" to be a single handle.', mfilename);
    return
end

if ~strcmpi(get(quivergroup_handle, 'Type'), 'hggroup')
    errrodlg('Input "quivergroup_handle" is not of type "hggroup".', mfilename);
    return
end

if ~exist('scaling_factor', 'var') || ...
   isempty(scaling_factor) || ...
   ~isnumeric(scaling_factor)
    errordlg('Input "scaling_factor" is missing, empty or non-numeric.', ...
             mfilename);
    return
end

if length(scaling_factor) > 1
    errordlg('Expected "scaling_factor" to be a scalar.', mfilename);
    return
end

if scaling_factor <= 0
    errordlg('"Scaling_factor" should be > 0.', mfilename);
    return
end

line_handles = get(quivergroup_handle, 'Children');

if isempty(line_handles) || (length(line_handles) < 3) || ...
   ~ishandle(line_handles(2)) || ~strcmpi(get(line_handles(2), 'Type'), 'line')
    errordlg('Unable to adjust arrowheads.', mfilename);
    return
end

arrowhead_line = line_handles(2);

XData = get(arrowhead_line, 'XData');
YData = get(arrowhead_line, 'YData');

if isempty(XData) || isempty(YData)
    return
end

%   Break up XData, YData into triplets separated by NaNs.
first_nan_index = find(~isnan(XData), 1, 'first');
last_nan_index  = find(~isnan(XData), 1, 'last');

for index = first_nan_index : 4 : last_nan_index
    these_indices = index + (0:2);
   
    if these_indices(end) > length(XData)
        break
    end
   
    x_triplet = XData(these_indices);
    y_triplet = YData(these_indices);
   
    if any(isnan(x_triplet)) || any(isnan(y_triplet))
        continue
    end
   
    %   First pair.
    delta_x = diff(x_triplet(1:2));
    delta_y = diff(y_triplet(1:2));
    x_triplet(1) = x_triplet(2) - (delta_x * scaling_factor);
    y_triplet(1) = y_triplet(2) - (delta_y * scaling_factor);
       
    %   Second pair.
    delta_x = diff(x_triplet(2:3));
    delta_y = diff(y_triplet(2:3));
    x_triplet(3) = x_triplet(2) + (delta_x * scaling_factor);
    y_triplet(3) = y_triplet(2) + (delta_y * scaling_factor);
   
    XData(these_indices) = x_triplet;
    YData(these_indices) = y_triplet;
end

set(arrowhead_line, 'XData', XData, 'YData', YData);


Hice un copy-paste de este link.

Por los comentarios que han hecho otros usuarios, parece que funciona bien. Lo que debes hacer es copiar el código que está arriba, guardarlo en un fichero .m en la ruta /usr/share/octave/3.6.4/m si fuera Linux (si es Windows, creo que sería C:\Archivos de programas\Octave\3.6.4\m) y luego invocar a la función adjust_quiver_arrowhead_size() en el script que estés usando para generar el gráfico.

Luego nos cuentas.
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

25 Enero, 2014, 03:44 pm
Respuesta #9

AniF

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 122
  • Karma: +0/-0
  • Sexo: Femenino
Gracias Pablo! Ya lo probaré y les cuento  ;). Por lo pronto pude solucionar el problemita de la flecha de una forma más rudimentaria.