MATLAB Language
Características no documentadas
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)
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] );
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] );
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
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);
Leer más en Undocumented Matlab