Buscar..


Observaciones

  • El uso de características no documentadas se considera una práctica arriesgada 1 , ya que estas características pueden cambiar sin previo aviso o simplemente funcionan de manera diferente en diferentes versiones de MATLAB. Por esta razón, se recomienda emplear técnicas de programación defensiva , como encerrar piezas de código no documentadas dentro de bloques try/catch con fallbacks documentados.

Funciones auxiliares compatibles con C ++

El uso de Matlab Coder a veces niega el uso de algunas funciones muy comunes, si no son compatibles con C ++. Relativamente a menudo existen funciones de ayuda indocumentadas , que se pueden usar como reemplazos.

Aquí hay una lista completa de las funciones compatibles. .

Y siguiendo una colección de alternativas, para funciones no soportadas:


Las funciones sprintf y sprintfc son bastante similares, la primera devuelve una matriz de caracteres , la última una cadena de celdas :

 str = sprintf('%i',x)   % returns '5' for x = 5
 str = sprintfc('%i',x)  % returns {'5'} for x = 5

Sin embargo, sprintfc es compatible con C ++ soportado por Matlab Coder, y sprintf no lo es.

Gráficos lineales 2D codificados por color con datos de color en la tercera dimensión

En las versiones de MATLAB anteriores a R2014b , utilizando el antiguo motor gráfico HG1, no era obvio cómo crear gráficos de líneas 2D codificados por colores . Con el lanzamiento del nuevo motor gráfico HG2 surgió una nueva característica no documentada presentada por Yair Altman :

n = 100;
x = linspace(-10,10,n); y = x.^2;
p = plot(x,y,'r', 'LineWidth',5);

% modified jet-colormap
cd = [uint8(jet(n)*255) uint8(ones(n,1))].';

drawnow
set(p.Edge, 'ColorBinding','interpolated', 'ColorData',cd)

trazo de línea

Marcadores semitransparentes en trazos de línea y dispersión.

Desde Matlab R2014b es fácilmente posible lograr marcadores semitransparentes para trazados de líneas y dispersión utilizando características no documentadas introducidas por Yair Altman .

La idea básica es obtener el controlador oculto de los marcadores y aplicar un valor <1 para el último valor en EdgeColorData para lograr la transparencia deseada.

Aquí vamos por la scatter :

%// example data
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);

%// plot scatter, get handle
h = scatter(x,y); 
drawnow; %// important

%// get marker handle
hMarkers = h.MarkerHandle; 

%// get current edge and face color
edgeColor = hMarkers.EdgeColorData
faceColor = hMarkers.FaceColorData

%// set face color to the same as edge color
faceColor = edgeColor;

%// opacity
opa = 0.3;

%// set marker edge and face color
hMarkers.EdgeColorData = uint8( [edgeColor(1:3); 255*opa] ); 
hMarkers.FaceColorData = uint8( [faceColor(1:3); 255*opa] ); 

introduzca la descripción de la imagen aquí

y para una línea de plot

%// example data
x = linspace(0,3*pi,200);
y1 = cos(x);
y2 = sin(x);

%// plot scatter, get handle
h1 = plot(x,y1,'o-','MarkerSize',15); hold on
h2 = plot(x,y2,'o-','MarkerSize',15); 
drawnow; %// important

%// get marker handle
h1Markers = h1.MarkerHandle; 
h2Markers = h2.MarkerHandle; 

%// get current edge and face color
edgeColor1 = h1Markers.EdgeColorData;
edgeColor2 = h2Markers.EdgeColorData;

%// set face color to the same as edge color
faceColor1 = edgeColor1;
faceColor2 = edgeColor2;

%// opacity
opa = 0.3;

%// set marker edge and face color
h1Markers.EdgeColorData = uint8( [edgeColor1(1:3); 255*opa] ); 
h1Markers.FaceColorData = uint8( [faceColor1(1:3); 255*opa] ); 
h2Markers.EdgeColorData = uint8( [edgeColor2(1:3); 255*opa] ); 
h2Markers.FaceColorData = uint8( [faceColor2(1:3); 255*opa] ); 

introduzca la descripción de la imagen aquí

Los identificadores de marcador, que se utilizan para la manipulación, se crean con la figura. El comando drawnow garantiza la creación de la figura antes de que se llame a los comandos subsiguientes y evita errores en caso de demoras.

Gráficos de contorno - Personalizar las etiquetas de texto

Al mostrar etiquetas en los contornos, Matlab no le permite controlar el formato de los números, por ejemplo, para cambiar a notación científica.

Los objetos de texto individuales son objetos de texto normales, pero la forma en que los obtiene no está documentada. Puede acceder a ellos desde la propiedad TextPrims del TextPrims de contorno.

  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  drawnow();
  txt = get(h,'TextPrims');
  v = str2double(get(txt,'String'));
  for ii=1:length(v)
    set(txt(ii),'String',sprintf('%0.3e',v(ii)))
  end

Nota : que debe agregar un comando de drawnow para forzar a Matlab a dibujar los contornos, el número y la ubicación de los objetos txt solo se determinan cuando los contornos se dibujan realmente, por lo que los objetos de texto solo se crean en ese momento.

El hecho de que los objetos txt se crean cuando se dibujan los contornos significa que se recalculan cada vez que la trama se vuelve a dibujar (por ejemplo, el tamaño de la figura). Para gestionar esto, necesita escuchar el undocumented event MarkedClean :

function customiseContour
  figure
  [X,Y]=meshgrid(0:100,0:100);
  Z=(X+Y.^2)*1e10;
  [C,h]=contour(X,Y,Z);
  h.ShowText='on';
  % add a listener and call your new format function
  addlistener(h,'MarkedClean',@(a,b)ReFormatText(a))
end
function ReFormatText(h)
  % get all the text items from the contour
  t = get(h,'TextPrims');
  for ii=1:length(t)
    % get the current value (Matlab changes this back when it 
    %   redraws the plot)
    v = str2double(get(t(ii),'String'));
    % Update with the format you want - scientific for example
    set(t(ii),'String',sprintf('%0.3e',v));
  end
end

introduzca la descripción de la imagen aquí

Ejemplo probado utilizando Matlab r2015b en Windows

Añadir / agregar entradas a una leyenda existente

Las leyendas existentes pueden ser difíciles de manejar. Por ejemplo, si su parcela tiene dos líneas, pero solo una de ellas tiene una entrada de leyenda y debería seguir siendo así, agregar una tercera línea con una entrada de leyenda puede ser difícil. Ejemplo:

figure
hold on
fplot(@sin)
fplot(@cos)
legend sin  % Add only a legend entry for sin
hTan = fplot(@tan);  % Make sure to get the handle, hTan, to the graphics object you want to add to the legend

Ahora, para agregar una entrada de leyenda para tan , pero no para cos , cualquiera de las siguientes líneas no funcionará; todos ellos fallan de alguna manera

legend tangent  % Replaces current legend -> fail
legend -DynamicLegend  % Undocumented feature, adds 'cos', which shouldn't be added -> fail
legend sine tangent  % Sets cos DisplayName to 'tangent' -> fail
legend sine '' tangent  % Sets cos DisplayName, albeit empty -> fail
legend(f)

Afortunadamente, una propiedad de leyenda no documentada llamada PlotChildren un seguimiento de los hijos de la figura principal 1 . Entonces, el camino a seguir es establecer explícitamente los hijos de la leyenda a través de su propiedad PlotChildren siguiente manera:

hTan.DisplayName = 'tangent';  % Set the graphics object's display name
l = legend;
l.PlotChildren(end + 1) = hTan;  % Append the graphics handle to legend's plot children

La leyenda se actualiza automáticamente si se agrega o elimina un objeto de su propiedad PlotChildren .

1 En efecto: figura. Puede agregar el elemento secundario de cualquier figura con la propiedad DisplayName a cualquier leyenda en la figura, por ejemplo, desde una trama secundaria diferente. Esto se debe a que una leyenda en sí misma es básicamente un objeto de ejes.

Probado en MATLAB R2016b

Dispersión de la trama de dispersión

La función de scatter tiene dos propiedades no documentadas 'jitter' y 'jitterAmount' que permiten jitter los datos solo en el eje x. Esto se remonta a Matlab 7.1 (2005), y posiblemente antes.

Para habilitar esta función, establezca la propiedad 'jitter' en 'on' y configure la propiedad 'jitterAmount' en el valor absoluto deseado (el valor predeterminado es 0.2 ).

Esto es muy útil cuando queremos visualizar datos superpuestos, por ejemplo:

scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);

jitter de datos superpuestos

Leer más en Undocumented Matlab



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow