На главнуюКонтактыКарта сайта
В коробке инженера
В коробке инженера
Обзоры программ, интересных блогов и программирование
Заметки о Rastrwin, Matlab
  • Twitter Colee

Управление Matlab из Total Commander

Автор: priester | Рубрика: Креатив » Программы » Matlab
Понедельник, 28 ноября 2011 г.
Теги: , Просмотров: 6987

Я уже давно не мыслю свою работу под Windows без файл-менеджера Total Commander (TC). Поэтому взаимодействие со всеми программами пытаюсь настроить именно через этот файл-менеджер, благо создатель TC Кристиан Гислер (Christian Ghisler) предусмотрел многие возможности для взаимодействия TC со сторонними программами. Эта заметка будет посвящена управлению Matlab с помощью Total Commander.

Конечно, благодаря программистам Matlab сделать то, что мною анонсировано в заголовке статьи, только с помощью Matlab и Total Commander проблематично (если не сказать, что невозможно). Одно небольшое отступление от темы – я вообще довольно охотно готов критиковать программистов Matlab, на сколько логичным, рациональным мне кажется Total Commander, на столько удивительно неуклюжим является с точки зрения удобства использования Matlab. И замечают это не только профессионалы, но и далекие от программирования люди. Matlab спасает только то, что его пользователи – удивительно талантливы. Чего стоит кладезь нужных программ mathworks.com, заметки undocumentedmatlab.com и т.д. Вот благодаря таким умельцам мне удалось осуществить мой замысел.

Итак, точнее заголовок заметки должен звучать так:

Управление Matlab с помощью matlabcontrol из Total Commander

Matlabcontrol – это Java API для управления Matlab. Удобен matlabcontrol тем, что для его использования не нужно знать Java.

Дальше изложение пойдет в форме коротких инструкций и будет рассчитано на людей, не знающих Java (таких же как я), но при этом понимающих, что такое программирование.

Предложенная схема у меня заработала для следующей конфигурации

OS Windows 7 x64
Matlab 7.12.0.635 (R2011a) x64
Total Commander x64 8.0 beta 9
Matlabcontrol 4.0.0

Для других версий OS, Total Commander,Matlab и matlabcontrol см. таблицу здесь

Результат:

Matlab-bar в Total Commander

На панели инструментов Total Commander создан набор инструментов для управление Matlab.

Инструкция: управление Matlab из Total Commander

  1. Скачиваем и устанавливаем Java Platform Standard Edition Development Kit (JDK) - набор инструментов разработчика программа на Java (этот набор включает также JRE (Java Runtime Environment) – среду для выполнения Java программ)
  2. Скачиваем matlabcontrolmatlabcontrol (нам нужен файл matlabcontrol-4.0.0.jar )
  3. Выбираем папку, в которой будут храниться все наши инструменты для управления Matlab (у меня для этих целей служит папка c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\, в которой хранятся созданные талантливыми пользователями Matlab скрипты необходимые мне для работы в Matlab).
  4. Копируем в эту папку файл matlabcontrol-4.0.0.jar.

  5. Добавляем эту папку c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\ в список путей Matlab (через меню Matlab File->Set Path, либо командой addpath('c:\Program Files\MATLAB\R2011a \work\Best_scripts_programs\' в консоли Matlab)
  6. В Total Commander создаем новую панель с инструментами под общим названием Matlab. Можно скачать уже готовую панель здесь
  7. Первая команда в панели не относится к Matlab, нужна для компиляции кода Java. Вот код этой кнопки (код можно скопировать и вставить в панель инструментов Total Commander правый клик мышью на панели инструментов-вставить):

    Код кнопки Compile java для Total Commander

    TOTALCMD#BAR#DATA
    %ComSpec% /k
    ? " "c:\Program Files\Java\jdk1.7.0_01\bin\javac.exe" -g %P%N -cp matlabcontrol-4.0.0.jar"
    C:\Program Files\Java\jdk1.7.0_01\bin\java.exe
    Compile java
    0
    -1
    ­

    Эта кнопка открывает консоль cmd (%ComSpec% /k), с помощью консоли запускает компилятор javac.exe для файла под курсором (%P%N) в окне TC, компилятору сообщается, что нужно подключить класс matlabcontrol-4.0.0.jar, а ключ –g нужен для того, чтобы генерировалась отладочная информация (на всякий случай).

    Начинаем заполнять панель инструментов Matlab в Total Commander новыми инструментами.

    Команда ClearVars - удаляет все переменные рабочей области (workspace) в текущей сессии Matlab.

  8. В папке c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\ создаем текстовый файл ClearVars.java со следующим содержимым:
  9. Код ClearVars.java

    import matlabcontrol.*;
    public class ClearVars
    {
    public static void main(String[] args)
    throws MatlabConnectionException, MatlabInvocationException
        {
     // create proxy
     MatlabProxyFactoryOptions options = new
     MatlabProxyFactoryOptions.Builder()
     .setUsePreviouslyControlledSession(true)
     .build();
     MatlabProxyFactory factory = new MatlabProxyFactory(options);
            MatlabProxy proxy = factory.getProxy(); 
     proxy.eval("clearvars");
     proxy.disconnect();
     }
    }

    Единственной моей строчкой в этом коде является строка proxy.eval("clearvars"), которая и вызвает команду Matlab clearvars для стирания всех переменных Matlab, все остальное – JAVA API для Matlab. Что это такое и как работает выходит за рамки данной заметки.

    Для пользователя важно только, что в строке 4 public class ClearVars последнее слово должно совпадать с названием файла. А в строке с proxy.eval можно выполнять любые команды Matlab (а с помощью proxy.feval и свои функции).

    Выделяем файл ClearVars.java в TC и нажимаем на кнопку Compile java. В папке c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\ должен появиться файл ClearVars.class. Для этого файла создаем в TC кнопку ClearVars:

    Код кнопки ClearVars

    TOTALCMD#BAR#DATA
    java
    -cp ".;matlabcontrol-4.0.0.jar" ClearVars
    %Commander_Path%\Icons\Matlab\1321736866_TRASH - FULL.ico
    Clear variables
    c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\
    1
    -1

    Как видно, эта кнопка запускает java.exe со следущими параметрами: нашей функцией ClearVars и с указанием класса matlabcontrol-4.0.0.jar (чтобы не прописывать полные пути к файлам можно поставить, как это и было сделано, путь запуска для кнопки c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\

    По такому же алгоритму создаются и все остальные команды-кнопки (ClearCommandPromt, ShowGcf)

  10. Более сложные примеры кнопок.

Код кнопки для загрузки выделенных файлов в Matlab

TOTALCMD#BAR#DATA
java
-cp ".;matlabcontrol-4.0.0.jar" LoadDataFile %P%S %S
%Commander_Path%\Icons\Matlab\1321732991_document-export._005.ico
Load txt-file as FileName variable
c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\
1
-1

Код LoadDataFile.java

import matlabcontrol.*;
public class LoadDataFile
{
 public static void main(String[] args)
 throws MatlabConnectionException, MatlabInvocationException
 {
 // create proxy
 MatlabProxyFactoryOptions options =
 new MatlabProxyFactoryOptions.Builder()
 .setUsePreviouslyControlledSession(true)
 .build();
 MatlabProxyFactory factory = new MatlabProxyFactory(options);
 MatlabProxy proxy = factory.getProxy();
 
  int num=args.length;  
  for (int i = 0; i <num/2 ; i++){
  String var_name_extension = new StringBuilder().append(args[num/2+i]).toString();
  String var_name=var_name_extension.substring(0,var_name_extension.length()-4); //delete extension
  String s = new StringBuilder().append(var_name).append("=load('").append(args[i]).append("');").toString();
 proxy.eval(s);
 } //cyclearguments
 proxy.disconnect();
 }
}

Total Commander передает в программу LoadDataFile следующие аргументы:

%P%S - полные пути выделенных файлов т.е. путь к файлу+название файла (если выделенных файлов нет, то передаются "координаты" файла под курсором)

%S - только название файла (этот аргумент нужен для того, чтобы не обрабатывать через Java полный путь к файлу, выделяя из него имя файла, а просто использовать данный параметр как имя новой переменной (удаляя из имени точку и название расширения - т.е. последние 4 символа)В самой программе LoadDataFile.java для обработки параметров появляется цикл, в котором выполняется команда Matlab var_name=load('File'), где var_name получается из переданного параметра %S путем удаления лишнего - точки и расширения, а File - просто пусть к файлу из переданного параметра %P%S

Похожа на LoadDataFile команда ImportData. ImportData я использую для того, чтобы загружать файлы специального содержания:

====Пример файла=========

#Simple test

#Just ignore this comments please!

a, m; b, cm; c, MW/m^3; d

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

=========================

При выполнении importdata_mod в Matlab загружаются вектора с именами а, b, с, d со значениями a=первый столбец числовых данных, b=второй столбец и т.д. Комментарии и размерности просто игнорируются (подробнее см. файл importdata_mod_demo.m и описание самой функции importdata_mod - все внутри архива MATLAB_TC.zip или отдельным архивом importdata_mod.zip

ImportData выполняет в Matlab функцию importdata_mod для заданного файла.

Код кнопки TC для ImportData

TOTALCMD#BAR#DATA
java
-cp ".;matlabcontrol-4.0.0.jar" ImportData %P%S
%Commander_Path%\Icons\Matlab\1321732489_data_004.ico
Import file using impordata_mod2
c:\Program Files\MATLAB\R2011a\work\Best_scripts_programs\
1
-1

Код ImportData.java

import matlabcontrol.*;
public class ImportData
{
 public static void main(String[] args)
 throws MatlabConnectionException, MatlabInvocationException
 {
 // create proxy
 MatlabProxyFactoryOptions options =
 new MatlabProxyFactoryOptions.Builder()
 .setUsePreviouslyControlledSession(true)
 .build();
 MatlabProxyFactory factory = new MatlabProxyFactory(options);
 MatlabProxy proxy = factory.getProxy();
 
  int num=args.length;
  for (int i = 0; i <num ; i++){  
  String s = new StringBuilder().append("importdata_mod('").append(args[i]).append("','as_is');").toString();
 proxy.eval(s);
 } //cycle arguments
 // close connection
 proxy.disconnect();
 }
}

Команда importdata_mod должна быть в списке путей Matlab, чтобы в таком виде код java смог выполниться.

Так же будет полезной команда быстро построить график поверхности заданной в текстовом файле (код здесь приводить не буду (там все тоже + команда surf или mesh, можно скачать готовые программы - ссылка в конце статьи)

Недостатки

Существенный недостаток текущей реализации управления Matlab из-под TC это то, что стоит только во время выполнения кода произойти какой-либо ошибке в Matlab из-за кнопки TC - придется создавать новую сессию для Matlab.

Заключение

В принципе, можно заставить Matlab выполнить любые команды из-под интерфейса Total Commander, причем если в параметрах кнопки для Total Commander поставить знак вопроса первым параметром, то при вызове кнопки можно самому указать любые команды для Matlab (нужно только, чтобы программа на Java могла корректно обработать эти команды). Я же в этой статье привел те команды, которыми сам регулярно пользуюсь для тестов, быстрого построения графиков и т.д. Надеюсь, что эти примеры пригодятся и моим читателям. Если найдутся те, кто готов поделиться своими идеями по поводу этой темы - жду ваши комментарии.

Все в одном архиве MATLAB_TC.zip 4 и importdata_mod.zip 2

При подготовке статьи использовались следующие материалы:


Поделиться с друзьями:
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com blogger.com livejournal.ru google.com yandex.ru del.icio.us
Оставьте комментарий!

Используйте нормальные имена

Ваш E-mail не публикуется, используется для обратной связи и для выбора аватара с сайта gravatar.com

Публикуется вместе с комментарием

усмешка LOL сыр улыбка подмигнуть ухмылка глаза в сторону в тупике удивление большое удивление малинка пустое лицо сдвинутая бровь Оо гррр ох ох неудачник смущенный больной Тау хммм бешенный злой клевый поцелуй шок крутой недовольный

Запрещается оскорблять окружающих и использовать ненормативную лексику

Вы должны включить JavaScript, чтобы оставить сообщение