Как нарисовать это дерево как решетчатую структуру в Matlab? - PullRequest
3 голосов
/ 06 марта 2011

Структура, которую я хочу нарисовать, должна быть в точности такой, как показано.Спасибо! enter image description here

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Вот небольшая функция, которую я выбрал, которая будет принимать в качестве входных данных квадратную, верхнетреугольную матрицу и строить структуру решетки, как указано выше:

function hFigure = plot_lattice(A)

  %# Compute all the coordinates needed for the lines and points:

  N = size(A,1);
  [xPoints,yPoints] = meshgrid(0:N-1);
  yPoints = bsxfun(@plus,-yPoints,0:0.5:(N-0.5)/2);
  xLines = [xPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); ...
            xPoints([1:N-1 N:-1:2],N).'];  %'
  yLines = [yPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); ...
            yPoints([1:N-1 N:-1:2],N).'];  %'
  index = find(triu(reshape(1:N^2,N,N)));
  xPoints = xPoints(index);
  yPoints = yPoints(index);
  values = strtrim(cellstr(num2str(A(index))));

  %# Create the figure:

  hFigure = figure('Color','w');
  hAxes = axes('Parent',hFigure,'XLim',[-0.5 N-0.5],...
               'YLim',[min(yPoints)-0.5 max(yPoints)+0.5],...
               'YColor','w','XTick',0:N-1,'LineWidth',2);
  hold on;
  plot(hAxes,xLines,yLines,'k','LineWidth',2);
  plot(hAxes,xPoints,yPoints,'o','MarkerFaceColor',[0.96 0.96 0.86],...
       'MarkerSize',30,'MarkerEdgeColor','k','LineWidth',2);
  text(xPoints,yPoints,values,'Parent',hAxes,...
       'HorizontalAlignment','center');
  hold off;

end

А вот тест с образцом матрицы:

>> A = triu(reshape(1:25,5,5))

A =

     1     6    11    16    21
     0     7    12    17    22
     0     0    13    18    23
     0     0     0    19    24
     0     0     0     0    25

>> plot_lattice(A);

enter image description here

2 голосов
/ 27 ноября 2013

Я немного изменил код, чтобы он мог печатать узлы, а также несколько значений в каждом узле.

A теперь является трехмерной матрицей и не может принимать также пустые значения (NaN), которые не напечатаны в дереве

Ofc код не является оптимальным ... может быть, один из вас может улучшить его

%# Compute all the coordinates needed for the lines and points:
      close all
      [N,L] = size(A);
      L=L/N;

      [xPoints,yPoints] = meshgrid(0:N-1);
      yPoints = bsxfun(@plus,-yPoints,0:0.5:(N-0.5)/2);
      xLines = [xPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); xPoints([1:N-1 N:-1:2],N).'];  
      yLines = [yPoints([1:N+1:N^2-N-1 1:N:N^2-2*N+1]); yPoints([1:N-1 N:-1:2],N).'];  
      index = find(triu(reshape(1:N^2,N,N)));
      xPoints = xPoints(index);
      yPoints = yPoints(index);
    %   values = strtrim(cellstr(num2str(A(index))));
      for i=1:L
        values(:,i) = strtrim(cellstr(num2str(A((i-1)*N*N+index))));
      end

      values = strrep(values, 'NaN', '   ');

    for i=1:N
        for j=i:N
            if i==1 && j==1
                nodes(i,j)=cellstr(strcat('N_','0'));
            else
                nodes(i,j)=cellstr(strcat('N_','{',repmat('u',1,(j-1)-(i-1)),repmat('d',1,(i-1)),'}'));
            end
        end
    end
    nodes = nodes(index);

      %# Create the figure:

      hFigure = figure('Color','w');
      hAxes = axes('Parent',hFigure,'XLim',[-0.5 N-0.5],'YLim',[min(yPoints)-0.5 max(yPoints)+0.5],'YColor','w','XTick',0:N-1,'LineWidth',2);
      hold on;
      plot(hAxes,xLines,yLines,'k','LineWidth',2);
      plot(hAxes,xPoints,yPoints,'o','MarkerFaceColor',[0.96 0.96 0.86],'MarkerSize',60,'MarkerEdgeColor','k','LineWidth',2);
      for i=1:L
        text(xPoints,yPoints+L*0.05-(i-1)*0.1,values(:,i),'Parent',hAxes,'HorizontalAlignment','center');
      end
      text(xPoints-0.4,yPoints,nodes,'Parent',hAxes,'HorizontalAlignment','center');
      hold off;
1 голос
/ 01 апреля 2011

Я бы использовал matlab для создания текстового файла для использования в Graphviz.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...