2016-03-31 7 views
0

Ich habe 20-40 diskrete Zahlen zu erstellen und speichern in einem Matlab-Programm. Ich versuche, eine Funktion zu erstellen, die mich Eingabeelemente ermöglichen (Bilder, Linien, Vektoren usw.) und geschichtete Plots erstellen, indem jedes Element vorbei for-Schleife() in einem plotten:Eingabe Strukturelemente in Matlab Plot() als Argumente

function [ ] = constructFigs(figTitle, backgroundClass, varargin) 

fig = figure('visible', 'off'); 

if strcmp(backgroundClass, 'plot') == 1 

    plot(varargin{1}); 

elseif strcmp(backgroundClass, 'image') == 1 

    imshow(varargin{1}); 

end 


for i = 1:length(varargin) 

    hold on 

    if ndims(varargin{i}) == 2 

     plot(varargin{i}(:, 1), varargin{i}(:, 2)) 

    else 

     plot(varargin{i}); 

    end 

end 

saveas(fig, figTitle); 

close(fig); 

end 

Diese Funktion ist aber ist sehr einschränkend in Bezug darauf, was geplottet werden kann; Sie können bestimmte Arten von Zeichenoperationen (z. B. überlagerte Bilder) nicht ausführen und können keine optionalen Argumente für plot() übergeben. Was ich tun möchte, ist, eine Struktur von Elementen, die gezeichnet werden sollen, zu übergeben und dann diese Strukturelemente in plot() als Argumente zu übergeben. Zum Beispiel (vereinfachte und mit schlechter Syntax):

toBePlotted = struct('arg1', {image}, 'arg2', {vector1, vector2, 'o'}) 


    plot(toBePlotted.arg1) 
    plot(toBePlotted.arg2) 

Ich bin in der Lage programmatisch die Strukturen mit dem Argumente Namen zu konstruieren, aber ich bin nicht in der Lage, die Elemente aus der Struktur in eine Weise, dass Handlung sie als Argument akzeptiert zu extrahieren .

Jede Hilfe wäre sehr

Antwort

1

Für Ihren Anwendungsfall zu erkennen ist, müssen Sie die Zellexpansion verwenden {:} die Eingänge zu füllen

plot(toBePlotted.arg1{:}) 
plot(toBePlotted.arg2{:}) 

Diese plotten werden die Elemente, die in dem Zellenfeld toBePlotted.arg1 erweitern als separate Eingabeargumente zu plot. Die andere Option besteht darin, line anstelle von plot (ein Grafikobjekt der unteren Ebene) zu verwenden und dem Konstruktor eine besser verständliche Struktur zu übergeben, die alle Parameter enthält, die Sie für dieses Diagramm verwenden möchten.

s = struct('XData', [1,2,3], 'YData', [4,5,6], 'Marker', 'o', 'LineStyle', 'none'); 
line(s) 

Ehrlich gesagt, ist es wahrscheinlich viel einfacher, sich das Plotten in Ihrem Programm zu tun, anstatt eine separate Funktion, weil es nicht viele benutzerdefinierte Parameter sind in Ihrer Funktion verwendet wird.

Wenn Sie wirklich einige Stromlinienförmige wollen Plotten Sie so etwas tun könnte:

function plotMyStuff(varargin) 

    fig = figure(); 
    hold on; 

    for k = 1:numel(varargin) 

     params = rmfield(varargin{k}, 'type'); 

     switch lower(varargin{k}.type) 
      case 'line' 
       line(params); 
      case 'image' 
       imagesc(params); 
      otherwise 
       disp('Not supported') 
       return 
     end 
    end 

    saveas(fig); 
    delete(fig); 
end 

plotMyStuff(struct('XData', [1,2], 'YData', [2,3], 'type', 'line'), ... 
      struct('CData', rand(10), 'type', 'image')); 
+0

Fantastisch, danke! – Hosty