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)

Liniendiagramm

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] ); 

Geben Sie hier die Bildbeschreibung ein

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] ); 

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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);

Jitter überlappende Daten

Lesen Sie mehr über Undokumentiertes Matlab



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow