Szukaj…


Uwagi

  • Korzystanie z funkcji nieudokumentowanych jest uważane za ryzykowną praktykę 1 , ponieważ funkcje te mogą ulec zmianie bez powiadomienia lub po prostu działać inaczej w różnych wersjach MATLAB. Z tego powodu zaleca się stosowanie defensywnych technik programowania , takich jak zamykanie nieudokumentowanych fragmentów kodu w blokach try/catch z udokumentowanymi błędami.

Funkcje pomocnicze kompatybilne z C ++

Użycie Matlab Coder czasami zaprzecza użyciu niektórych bardzo popularnych funkcji, jeśli nie są one kompatybilne z C ++. Stosunkowo często istnieją nieudokumentowane funkcje pomocnicze , które można wykorzystać jako zamienniki.

Oto pełna lista obsługiwanych funkcji. .

I po kolekcji alternatyw dla nieobsługiwanych funkcji:


Funkcje sprintf i sprintfc są dość podobne, pierwsze zwraca tablicę znaków , drugie ciąg znaków komórki :

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

Jednak sprintfc jest kompatybilny z C ++ obsługiwanym przez Matlab Coder, a sprintf nie.

Wykresy liniowe 2D oznaczone kolorami z danymi kolorów w trzecim wymiarze

W wersjach MATLAB wcześniejszych niż R2014b , wykorzystujących stary silnik graficzny HG1, nie było oczywiste, jak tworzyć kolorowe linie 2D . Wraz z wydaniem nowego silnika graficznego HG2 powstała nowa nieudokumentowana funkcja wprowadzona przez 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)

wykres liniowy

Półprzezroczyste markery na wykresach liniowych i punktowych

Od Matlaba R2014b można łatwo uzyskać półprzezroczyste markery dla wykresów liniowych i punktowych przy użyciu nieudokumentowanych funkcji wprowadzonych przez Yair Altman .

Podstawowym pomysłem jest uzyskanie ukrytego uchwytu znaczników i zastosowanie wartości <1 dla ostatniej wartości w EdgeColorData aby osiągnąć pożądaną przezroczystość.

Tutaj idziemy do 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] ); 

wprowadź opis zdjęcia tutaj

i dla plot liniowego

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

wprowadź opis zdjęcia tutaj

Uchwyty znaczników, które są używane do manipulacji, są tworzone z figurą. Polecenie drawnow zapewnia utworzenie figury przed wywołaniem kolejnych poleceń i pozwala uniknąć błędów w przypadku opóźnień.

Wykresy konturowe - Dostosuj etykiety tekstowe

Podczas wyświetlania etykiet na konturach Matlab nie pozwala kontrolować formatu liczb, na przykład zmienić na notację naukową.

Poszczególne obiekty tekstowe są normalnymi obiektami tekstowymi, ale sposób ich uzyskania jest nieudokumentowany. Dostęp do nich można uzyskać z właściwości TextPrims uchwytu konturu.

  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

Uwaga : musisz dodać polecenie drawnow aby zmusić Matlab do rysowania konturów, liczba i lokalizacja obiektów tekstowych są określane tylko wtedy, gdy kontury są rysowane, więc obiekty tekstowe są tworzone tylko wtedy.

Fakt, że obiekty txt są tworzone podczas rysowania konturów, oznacza, że są one ponownie obliczane za każdym razem, gdy wykres jest przerysowywany (na przykład zmiana rozmiaru figury). Aby to zrobić, musisz odsłuchać 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

wprowadź opis zdjęcia tutaj

Przykład przetestowany przy użyciu Matlab r2015b w systemie Windows

Dołączanie / dodawanie wpisów do istniejącej legendy

Istniejące legendy mogą być trudne do zarządzania. Na przykład, jeśli twoja fabuła ma dwie linie, ale tylko jedna z nich zawiera wpis legendy i tak powinno pozostać, dodanie trzeciego wiersza z wpisem legendy może być trudne. Przykład:

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

Teraz, aby dodać pozycję legendy dla tan , ale nie dla cos , żadna z poniższych linii nie załatwi sprawy; wszystkie w jakiś sposób zawodzą:

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)

Na szczęście nieudokumentowana właściwość legendy o nazwie PlotChildren śledzi dzieci nadrzędnej postaci 1 . Tak więc sposobem jest jawne ustawienie dzieci legendy za pomocą jej właściwości PlotChildren w następujący sposób:

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

Legenda aktualizuje się automatycznie, jeśli obiekt zostanie dodany lub usunięty z jego właściwości PlotChildren .

1 Rzeczywiście: rysunek. Możesz dodać dziecko dowolnej figury za pomocą właściwości DisplayName do dowolnej legendy na figurze, np. Z innego wykresu podrzędnego. Wynika to z faktu, że legenda sama w sobie jest zasadniczo obiektem osi.

Testowany na MATLAB R2016b

Drgania wykresu rozrzutu

Funkcja scatter ma dwie nieudokumentowane właściwości 'jitter' i 'jitterAmount' które pozwalają na 'jitterAmount' danych tylko na osi 'jitterAmount' To sięga Matlaba 7.1 (2005) i być może wcześniej.

Aby włączyć tę funkcję, ustaw właściwość 'jitter' na 'on' i ustaw właściwość 'jitterAmount' na żądaną wartość bezwzględną (wartość domyślna to 0.2 ).

Jest to bardzo przydatne, gdy chcemy wizualizować nakładające się dane, na przykład:

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

jitter nakładających się danych

Przeczytaj więcej na temat Nieudokumentowanego Matlaba



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow