2017-07-28 2 views
1

würde ich einen Wrapper für die save Funktion von Matlab mit vordefinierten Optionen zu schreiben (vordefiniert version in meinem Fall Speichern großer Dateien zu ermöglichen), also so etwas wie diesesSchreib Wrapper für matlabs speichern Funktion

save('parameters.mat', 'some', 'parameters', 'here', '-v.3'); 

drehen sollte in diesem

save_large('parameters.mat', 'some', 'parameters', 'here'); 

wo save_large ein Wrapper für save mit version Set '-v7.3' ist:

function [ ] = save_large(filename, varargin) 
%varargin to allow for multiple variable storing? 

%what to write here to save all variables (declared as chars) stored in 
%the workspace where 'save_large' was called with version set to '-v7.3'? 

end 

Antwort

2

Da die Variablen nicht in den Anwendungsbereich der Funktion save_large existieren, müssen Sie evalin verwenden, um die Variable aus dem "caller" Arbeitsplatz zu bekommen.

Mit try können wir auch sicherstellen, dass die Variable im Arbeitsbereich des Aufrufers existiert.

Um die richtigen Variablennamen in Ihrer .mat-Datei zu erhalten, könnten wir entweder den (entmutigt) eval Funktion oder das unten stehende Verfahren, das alle Variablen auf eine Struktur, und verwenden Sie dann die -struct Flagge in save zuweist.

function save_large(filename, varargin) 
    % Set up struct for saving 
    savestruct = struct(); 
    for n = 1:numel(varargin) 
     % Test if variable exists in caller workspace 
     % Do this by trying to assign to struct 
     % Use parentheses for creating field equal to string from varargin 
     try savestruct.(varargin{n}) = evalin('caller', varargin{n}); 
      % Successful assignment to struct, no action needed 
     catch 
      warning(['Could not find variable: ', varargin{n}]); 
     end 
    end 
    save(filename, '-struct', 'savestruct', '-v7.3'); 
end 

Beispiel

% Create dummy variables and save them 
a = magic(3); 
b = 'abc'; 
save_large test.mat a b; 
% Clear workspace to get rid of a and b 
clear a b 
exist a var % false 
exist b var % false 
% Load from file 
load test.mat 
% a and b in workspace 
exist a var % true 
exist b var % true  
+0

Vielleicht erwähnenswert, erkannte ich, Sie entfernen konnte 'v' vollständig aktualisierte Code effizient, da keine Zwischenvariable vermutlich mehr Speicher benötigt wird. – Wolfie