2012-07-01 2 views
0

Я использовал MatlabConrol для подключения Java и MATLAB. Я хочу отправить путь к MATLAB для обработки его с помощью соответствующих функций и вернуть мне несколько похожих изображений и путей, чтобы показать их в графическом интерфейсе Java.Ошибка использования eval в matlabcontrol

Я всегда получаю ту же ошибку при прохождении контура изображения в MATLAB:

Error using eval 
Undefined function 'getinput' for input arguments of type 'char'. 

Вот моя функция MATLAB:

function matlab = getinput(input) 
results = hgr(input); 

И мой Java код:

imag = ImageIO.read(fileChoose.getSelectedFile()); 
ImagePath = fileChoose.getSelectedFile().getAbsolutePath(); 

public void SendingMatlabControl() throws MatlabConnectionException, 
    MatlabInvocationException { 
    // create proxy 
    MatlabProxy proxy; 
    // Create a proxy, which we will use to control MATLAB 
    MatlabProxyFactory factory = new MatlabProxyFactory(); 
    proxy = factory.getProxy(); 
    // Display 'hello world' like before, but this time using feval 
    try { 
     // call builtin function 
     proxy.eval("getinput('imagepath')"); 
     // call user-defined function (must be on the path) 
     proxy.eval("addpath('E:\\vm')"); 
     proxy.feval("matlab"); 
     proxy.eval("rmpath('E:\\vm)"); 
    } catch (MatlabInvocationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // Disconnect the proxy from MatLab 
    proxy.disconnect(); 
    } 
+0

Функция «встроенная функция вызова», похоже, предполагает, что 'getinput' является встроенной функцией, но я не мог найти упоминания об этом на веб-сайте MathWorks. Вы уверены, что это встроенная функция? –

ответ

3

Пусть я приведу пример вызова функции, передачи ее ввода и получения вывода. Есть два способа, как:

  • использование eval и присвоить результат функции внутри рабочего пространства MATLAB, а затем получить эти переменные с помощью getVariable или
  • использовать returningFeval оценить функцию со своими входами и напрямую получить выход.

Пусть мы имели функцию MATLAB myfunc.m, которая принимает строку в качестве входных данных и возвращает массив ячеек, содержащий строку, число, и вектор:

function out = myfunc(str) 
    out = cell(3,1); 
    out{1} = sprintf('Welcome to %s!', str); 
    out{2} = 99; 
    out{3} = rand(10,1); 
end 

Вот код Java :

import matlabcontrol.*; 

public class TestMyFunc 
{ 
    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(); 

     // call function and get output cell array 
     String in = "Stack Overflow"; 
     Object[] out = proxy.returningFeval("myfunc", 1, in); 

     // extract stuff from cell array 
     out = (Object[]) out[0]; 
     String str = (String) out[0]; 
     double x = ((double[]) out[1])[0]; 
     double[] arr = (double[]) out[2]; 

     // show result 
     System.out.println("str =\n " + str); 
     System.out.println("x = \n " + x); 
     System.out.println("arr ="); 
     for(int i=0; i < arr.length; i++) { 
      System.out.println(" " + arr[i]); 
     } 

     // shutdown MATLAB 
     //proxy.feval("quit"); 

     // close connection 
     proxy.disconnect(); 
    } 
} 

Я получаю результат:

str = 
Welcome to Stack Overflow! 
x = 
99.0 
arr = 
0.5974901918725793 
0.3353113307052461 
0.29922502333310663 
0.45259254156932405 
0.42264565322046244 
0.35960631797223563 
0.5583191998692971 
0.7425453657019391 
0.42433478362569066 
0.42935578857620504 
+0

все в порядке, но теперь мне нужно сначала пройти путь изображения, используя feval, тогда, когда все m-файлы будут выполнены, я буду использовать возвращаемыйFeval как упомянутый выше, чтобы получить выходной номер изображения (скажите, если я ошибаюсь) ,,, проблема у меня все еще есть одно и то же исключение, у меня есть какие-либо проблемы в моем коде выше, я действительно теряю рассудок :( – user1318251

+0

@ user1318251: нет, вы используете 'returnFeval' для вызова вашей m-функции, проходящей путь изображения и получения результата в том же Пожалуйста, прочитайте проект [Wiki] (http://code.google.com/p/matlabcontrol/wiki/Walkthrough) и документы Java – Amro

+0

. Я запустил ваш код и все еще имею эту ошибку «Неопределенная функция« myfunc »для ввода аргументы типа «char». »и при запуске вашей функции matlab он дал мне эту ошибку« Ошибка с использованием myfuncs (строка 3) Недостаточно входных аргументов ». знаете ли вы, в чем проблема? – user1318251

Смежные вопросы