Поиск…


замечания

  • Использование недокументированных функций считается рискованной практикой 1 , так как эти функции могут меняться без предупреждения или просто работать по-разному в разных версиях MATLAB. По этой причине рекомендуется использовать защитные методы программирования , такие как включение недокументированных фрагментов кода в блоки try/catch с документально подтвержденными резервными копиями.

Совместимые с C ++ вспомогательные функции

Использование Matlab Coder иногда отрицает использование некоторых очень общих функций, если они не совместимы с C ++. Относительно часто существуют недокументированные вспомогательные функции , которые могут использоваться как замены.

Ниже приведен полный список поддерживаемых функций. ,

И после сбора альтернатив для не поддерживаемых функций:


Функции sprintf и sprintfc весьма схожи, первый возвращает массив символов , последний - строку ячейки :

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

Однако sprintfc совместим с C ++, поддерживаемым Matlab Coder, а sprintf - нет.

Цветные 2D-линии с цветовыми данными в третьем измерении

В версиях MATLAB до R2014b , используя старый графический движок HG1, было не очевидно, как создавать цветные 2D-графики . С выпуском нового графического движка HG2 возникла новая недокументированная функция, представленная Яиром Альтманом :

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)

линейный график

Полупрозрачные маркеры в линиях и разбросах

Поскольку Matlab R2014b легко получить полупрозрачные маркеры для линейных и рассеивающих графиков, используя недокументированные функции, представленные Яиром Альтманом .

Основная идея состоит в том, чтобы получить скрытый дескриптор маркеров и применить значение <1 для последнего значения в EdgeColorData для достижения желаемой прозрачности.

Здесь мы идем за 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] ); 

введите описание изображения здесь

и для линейного 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] ); 

введите описание изображения здесь

Маркерные ручки, которые используются для манипуляции, создаются с помощью рисунка. Команда drawnow обеспечивает создание фигуры перед drawnow последующих команд и позволяет избежать ошибок в случае задержек.

Контурные сюжеты - настройка текстовых меток

При отображении меток на контурах Matlab не позволяет вам контролировать формат чисел, например, чтобы перейти к научной нотации.

Отдельные текстовые объекты являются обычными текстовыми объектами, но то, как вы их получаете, недокументировано. Вы TextPrims доступ к ним из свойства TextPrims контура.

  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

Обратите внимание : что вы должны добавить команду drawnow чтобы заставить Matlab рисовать контуры, число и местоположение объектов txt определяются только тогда, когда контуры фактически нарисованы, поэтому текстовые объекты создаются тогда.

Тот факт, что объекты txt создаются при рисовании контуров, означает, что они пересчитываются каждый раз, когда график перерисовывается (например, изменение размера фигуры). Чтобы управлять этим, вам необходимо прослушать 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

введите описание изображения здесь

Пример, протестированный с использованием Matlab r2015b в Windows

Добавление / добавление записей в существующую легенду

Существующие легенды трудно справиться. Например, если ваш сюжет имеет две строки, но только один из них имеет запись с легендой, и это должно остаться таким образом, то добавление третьей строки с записью легенды может быть затруднено. Пример:

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

Теперь, чтобы добавить запись легенды для tan , но не для cos , любая из следующих строк не будет делать трюк; они все так или иначе терпят неудачу:

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)

К счастью, недокументированное свойство легенды, называемое PlotChildren отслеживает детей родительской фигуры 1 . Таким образом, путь заключается в том, чтобы явно установить детей легенды с помощью свойства 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

Легенда обновляется автоматически, если объект добавлен или удален из свойства PlotChildren .

1 Действительно: цифра. Вы можете добавить ребенка любой фигуры с свойством DisplayName к любой легенде на рисунке, например, из другого подзаголовка. Это потому, что легенда сама по себе представляет собой объект осей.

Протестировано на MATLAB R2016b

Фрагмент дрожания графика

Функция scatter имеет два недокументированных свойства 'jitter' и 'jitterAmount' которые позволяют 'jitterAmount' только данные по оси x. Это относится к Matlab 7.1 (2005) и, возможно, ранее.

Чтобы включить эту функцию установки 'jitter' свойство 'on' и установить 'jitterAmount' свойства до требуемого абсолютного значения (по умолчанию 0.2 ).

Это очень полезно, когда мы хотим визуализировать перекрывающиеся данные, например:

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

данные перекрытия джиттера

Подробнее о недокументированной Matlab



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow