MATLAB Language
Undokumentierte Funktionen
Suche…
Bemerkungen
- Die Verwendung undokumentierter Funktionen wird als riskante Übung 1 angesehen , da diese Funktionen ohne vorherige Ankündigung geändert werden können oder bei verschiedenen MATLAB-Versionen einfach anders funktionieren. Aus diesem Grund ist es ratsam, defensive Programmiertechniken einzusetzen, z. B. das Einschließen von undokumentierten Codeteilen in
try/catch
Blöcken mit dokumentierten Fallbacks.
C ++ - kompatible Hilfsfunktionen
Die Verwendung von Matlab Coder verweigert manchmal die Verwendung einiger sehr häufiger Funktionen, wenn diese nicht mit C ++ kompatibel sind. Relativ oft gibt es undokumentierte Hilfsfunktionen , die als Ersatz verwendet werden können.
Hier ist eine umfassende Liste der unterstützten Funktionen. .
Und im Anschluss an eine Sammlung von Alternativen für nicht unterstützte Funktionen:
Die Funktionen sprintf
und sprintfc
sind ziemlich ähnlich, die früheren kehrt ein Zeichenarray, wobei letztere eine Zellenfolge:
str = sprintf('%i',x) % returns '5' for x = 5
str = sprintfc('%i',x) % returns {'5'} for x = 5
sprintfc
ist jedoch mit C ++ kompatibel, das von Matlab Coder unterstützt wird, und sprintf
nicht.
Farbkodierte 2D-Liniendiagramme mit Farbdaten in der dritten Dimension
In MATLAB-Versionen vor R2014b war es nicht offensichtlich, wie mit der alten HG1-Grafik-Engine farbige 2D-Liniendiagramme erstellt werden . Mit der Veröffentlichung der neuen HG2-Grafik-Engine entstand eine neue undokumentierte Funktion, die von Yair Altman eingeführt wurde :
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)
Halbtransparente Marker in Linien- und Streudiagrammen
Seit Matlab R2014b ist es leicht möglich, semitransparente Marker für Linien- und Streudiagramme mit undokumentierten Merkmalen von Yair Altman zu erstellen .
Die Grundidee besteht darin, den versteckten Griff der Marken zu erhalten und einen Wert <1 für den letzten Wert in der EdgeColorData
, um die gewünschte Transparenz zu erzielen.
Hier scatter
wir:
%// 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] );
und für eine Linie 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] );
Die Markierungspunkte, die für die Manipulation verwendet werden, werden mit der Figur erstellt. Der drawnow
Befehl stellt die Erstellung der Figur sicher, bevor nachfolgende Befehle aufgerufen werden, und vermeidet Fehler bei Verzögerungen.
Konturdiagramme - Passen Sie die Textbeschriftungen an
Bei der Anzeige von Beschriftungen auf Konturen erlaubt es Matlab nicht, das Format der Zahlen zu steuern, beispielsweise um in die wissenschaftliche Notation zu wechseln.
Die einzelnen Textobjekte sind normale Textobjekte, aber wie Sie sie erhalten, ist nicht dokumentiert. Sie können auf sie über die TextPrims
Eigenschaft des TextPrims
zugreifen.
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
Hinweis : Sie müssen einen drawnow
Befehl hinzufügen, um Matlab zum Zeichnen der Konturen zu zwingen. Die Anzahl und Position der Textobjekte wird nur bestimmt, wenn die Konturen tatsächlich gezeichnet werden.
Die Tatsache, dass die TXT-Objekte erstellt werden, wenn die Konturen gezeichnet werden, bedeutet, dass sie jedes Mal neu berechnet werden, wenn der Plot neu gezeichnet wird (z. B. Größenänderung von Figuren). Um dies zu erreichen, müssen Sie das 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
Beispiel mit Matlab r2015b unter Windows getestet
Hinzufügen / Hinzufügen von Einträgen zu einer vorhandenen Legende
Bestehende Legenden können schwer zu handhaben sein. Wenn Ihr Diagramm beispielsweise zwei Zeilen hat, aber nur eine davon einen Legendeneintrag hat, und dies sollte so bleiben, kann das Hinzufügen einer dritten Zeile mit einem Legendeneintrag schwierig sein. Beispiel:
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
Wenn Sie jetzt einen Legendeneintrag für tan
hinzufügen tan
, aber nicht für cos
, wird eine der folgenden Zeilen nicht ausreichen. Sie alle scheitern irgendwie:
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)
Glücklicherweise verfolgt eine undokumentierte Legendeneigenschaft namens PlotChildren
die PlotChildren
der übergeordneten Abbildung 1 . Daher müssen Sie die PlotChildren
der Legende durch ihre PlotChildren
Eigenschaft explizit wie folgt PlotChildren
:
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
Die Legende wird automatisch aktualisiert, wenn ein Objekt zur PlotChildren
Eigenschaft hinzugefügt oder daraus entfernt wird.
1 In der Tat: Figur. Sie können die DisplayName
einer Figur mit der Eigenschaft DisplayName
zu jeder Legende in der Abbildung hinzufügen, z. B. aus einem anderen Subplot. Dies liegt daran, dass eine Legende an sich im Wesentlichen ein Achsenobjekt ist.
Getestet mit MATLAB R2016b
Streuungsplot-Jitter
Die scatter
Funktion verfügt über die beiden nicht dokumentierten Eigenschaften 'jitter'
und 'jitterAmount'
, mit denen die Daten nur auf der X-Achse 'jitterAmount'
. Dies geht auf Matlab 7.1 (2005) und möglicherweise früher zurück.
Um diese Funktion zu aktivieren, setzen Sie die Eigenschaft 'jitter'
auf 'on'
und die Eigenschaft 'jitterAmount'
auf den gewünschten absoluten Wert (Standardeinstellung ist 0.2
).
Dies ist sehr nützlich, wenn wir überlappende Daten visualisieren möchten, zum Beispiel:
scatter(ones(1,10), ones(1,10), 'jitter', 'on', 'jitterAmount', 0.5);
Lesen Sie mehr über Undokumentiertes Matlab