Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Working with different version of Matlab Function

Tags:

matlab

We have a legacy definition of a matlab function nanstd.m which is being called in a whole lot of functions.

The legacy version has definition like:

function y = nanstd(x, dim);

The above definition is stored on our local server drive "H\Util\Functions".

The newer version of matlab has a differetn definition which is:

function y = nanstd(fts, varargin)

The above translates to:

Y = nanstd(X,flag,dim)

The above is stored under "C\Program Files\Matlab".

We need both versions to be available. Is it possible that I can write a code which says something like if there are 2 arguments input use nanstd.m at "H\Util\Functions" and if there are 3 inputs use nanstd.m at "C\Program Files\Matlab".

Thanks

like image 507
Zanam Avatar asked Oct 04 '13 14:10

Zanam


2 Answers

Since your legacy definition should come before the builtin version on your path, you could simply add the following to your custom nanstd so it behaves as follows:

function y = nanstd(x,varargin)

if nargin > 2
    wd = cd(fullfile(matlabroot,'toolbox','stats','stats'));
    y = nanstd(x,varargin{:});
    cd(wd)
    return
elseif nargin == 2
    flag = varargin{1};
end

%// ... continue custom nanstd function

As per this discussion on MatlabCentral, the only way to run a shadowed function is to change to its directory. Amazingly enough, the path favors the current directory to the current function — something that surprised me — but it's beneficial for this case. This allows you to simply modify your custom legacy nanstd function to kick out to the builtin definition.

Edit: you may want to wrap the call to the stats nanstd with a try/catch so your directory always gets restored, even in case of an error.

like image 165
mbauman Avatar answered Sep 29 '22 10:09

mbauman


Recommended approach

This is probably the way I would do it (if I didn't want to make a complete mess in the future).

Locate all old files, and replace nanstd( by nanstdold(, this can be automated in many ways.

(If you actually have variables named nanstd you will feel the pain of course)

Then, to be safe define your function as follows:

function y = nanstdold(fts, varargin)

if nargin = 2
   y = nanstd(fts,[],varargin)
else
   y = nanstd(fts,varargin)
end

You may need to tweak the first call to nanstd, but I think this line of thought should get you there.

Make sure to burn the nanstd function that only takes 2 input arguments, so you cannot accidentally refer to it.

like image 21
Dennis Jaheruddin Avatar answered Sep 29 '22 10:09

Dennis Jaheruddin