views:

1116

answers:

2

In order to distribute a function I've written that depends on other functions I've written that have their own dependencies and so on without distributing every m-file I have ever written, I need to figure out what the full list of dependencies is for a given m-file. Is there a built-in/freely downloadable way to do this?

Specifically I am interested in solutions for MATLAB 7.4.0 (R2007a), but if there is a different way to do it in older versions, by all means please add them here.

A: 

As far as I know, there is no Matlab-own way to do this.

I got 2 possible solutions:

1. for many dependencies

  1. get a list of all native Matlab functions http://www.google.de/search?q=list+of+all+matlab+functions&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:de:official&client=firefox-a">click link
  2. perform a search in your function for non Matlab calls (I guess you can simply assume, that every word right before an opening brace "(" is a function)
  3. then add this m-file to your release
  4. recursively search the newly added files for non Matlab function calls
  5. go to 3. if you found new "self-made" functions ( recursion rules xD ) - else you are ready to release

2. small project

  1. copy your file to a clean directory
  2. try to run the function
  3. resolve dependency-errors by hand

good luck ;)

mana
Since parentheses are the way that matlab indexes matrices, you can't assume that every word in front of a parenthesis is a function name.
rmukhopadhyay
+11  A: 

For newer releases of Matlab (eg 2007 or 2008) you could use the built in functions:

  1. mlint
  2. dependency report and
  3. coverage report

Another option is to use Matlab's profiler. The command is profile, it can also be used to track dependencies. To use profile, you could do

>> profile on   % turn profiling on
>> foo;         % entry point to your matlab function or script
>> profile off  % turn profiling off
>> profview     % view the report

If profiler is not available, then perhaps the following two functions are:

  1. depfun
  2. depdir

For example,

>> deps = depfun('foo');

gives a structure, deps, that contains all the dependencies of foo.m.

If you don't have access to any of these built in Matlab functions you could try searching through Mathworks Central File Exchange. For example there is one item fdep that seems promising but I haven't tried or tested yet.

EDIT:

Caveats thanks to @Mike Katz comments

  • Remember that the Profiler will only show you files that were actually used in those runs, so if you don't go through every branch, you may have additional dependencies. The dependency report is a good tool, but only resolves static dependencies on the path and just for the files in a single directory.

  • Depfun is more reliable but gives you every possible thing it can think of, and still misses LOAD's and EVAL's.

Azim
Remember that the Profiler will only show you files that were actually used in those runs, so if you don't go through every branch, you may have additional dependencies. The dependency repot is a good tool, but only resolves static dependencies on the path and just for the files in a single dir.
Mike Katz
Depfun is more reliable but gives you every possible thing it can think of, and still misses LOAD's and EVAL's.
Mike Katz
Thanks @Mik Katz for the caveats.
Azim
Try exportToZip (link: http://www.mathworks.com/matlabcentral/fileexchange/10702).It was pick of the week on September 18, 2009 (link: http://blogs.mathworks.com/pick/2009/09/18/easier-and-less-error-prone-creation-of-zip-files/)
Samil