exponenta event banner

Использование нескольких пакетов в одном приложении

При разработке приложений, использующих несколько пакетов MATLAB ®, необходимо учитывать, что следующие компоненты не могут совместно использоваться сборками:

  • Дескрипторы функций MATLAB

  • Ручки фигур MATLAB

  • Объекты MATLAB

  • Объекты C, Java ® и .NET

  • Исполняемые данные, хранящиеся в массивах и структурах ячеек

Работа с дескрипторами функций MATLAB

Дескрипторы функций MATLAB могут передаваться между приложением и экземпляром MATLAB Runtime, из которого он был создан. Однако дескриптор функции MATLAB не может быть передан в экземпляр среды выполнения MATLAB, отличный от того, в котором он был создан. Например, предположим, что у вас было две функции MATLAB, get_plot_handle и plot_xy, и plot_xy использовал дескриптор функции, созданный get_plot_handle.

% Saved as get_plot_handle.m
function h = get_plot_handle(lnSpec, lnWidth, mkEdge, mkFace, mkSize)
h = @draw_plot;
    function draw_plot(x, y)
        plot(x, y, lnSpec, ...
            'LineWidth', lnWidth, ...
            'MarkerEdgeColor', mkEdge, ...
            'MarkerFaceColor', mkFace, ...
            'MarkerSize', mkSize)
    end
end
% Saved as plot_xy.m
function plot_xy(x, y, h)
h(x, y);
end

Если вы скомпилировали их в два пакета, вызов plot_xy вызовет исключение.

import com.mathworks.toolbox.javabuilder.*;
import get_plot_handle.*;
import plot_xy.*;


class plottter
{
   public static void main(String[] args)
   {
     MWArray h = null;

      try
      {
        plotter_handle = new get_plot_handle.Class1();
        plot = new plot_xy.Class1();

        h = plotter_handle.get_plot_handle(1,'--rs',2.0,'k','g',10);
        double[] x = {1,2,3,4,5,6,7,8,9};
        double[] y = {2,6,12,20,30,42,56,72,90};
        plot.plot_xy(x, y, h);
      }
      catch (Exception e)
      {
         System.out.println("Exception: " + e.toString());
      }
      finally
      {
         MWArray.disposeArray(h);
         plot.dispose();
         plotter_handle.dispose();
      }
   }
}

Правильный способ справиться с ситуацией - скомпилировать обе функции в один пакет.

import com.mathworks.toolbox.javabuilder.*;
import plot_functions.*;

class plotter
{
   public static void main(String[] args)
   {
     MWArray h = null;

      try
      {
        plot_funcs = new Class1();

        h = plot_funcs.get_plot_handle(1, '--rs', 2.0, 'k', 'g', 10);
        double[] x = {1,2,3,4,5,6,7,8,9};
        double[] y = {2,6,12,20,30,42,56,72,90};
        plot_funcs.plot_xy(x, y, h);
      }
      catch (Exception e)
      {
         System.out.println("Exception: " + e.toString());
      }
      finally
      {
         MWArray.disposeArray(h);
         plot_funcs.dispose();
      }
   }
}

Примечание

Эту ситуацию можно также обработать с помощью одиночной среды выполнения MATLAB.

Работа с объектами

SDK™ компилятора MATLAB позволяет возвращать следующие типы объектов из среды выполнения MATLAB в код приложения:

  • MATLAB

  • C++

  • .NET

  • Ява

Однако невозможно передать объект, созданный в одном экземпляре среды выполнения MATLAB, в другой экземпляр среды выполнения MATLAB. Этот конфликт может возникнуть, когда функция, возвращающая объект, и функция, управляющая этим объектом, компилируются в различные пакеты.

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

% Saved as account.m
classdef account < handle

    properties
        name
    end
    
    properties (SetAccess = protected)
        balance = 0
        number
    end
    
    methods
        function obj = account(name)
            obj.name = name;
            obj.number = round(rand * 1000);
        end
        
        function deposit(obj, deposit)
            new_bal = obj.balance + deposit;
            obj.balance = new_bal;
        end
        
        function withdraw(obj, withdrawl)
            new_bal = obj.balance - withdrawl;
            obj.balance = new_bal;
        end
        
    end
end
% Saved as open_acct .m
function acct = open_acct(name, open_bal )

    acct = account(name);

    if open_bal > 0
        acct.deposit(open_bal);
    end
    
end
% Saved as transfer.m
function transfer(source, dest, amount)

    if (source.balance > amount)
        dest.deposit(amount);
        source.withdraw(amount);
    end

end

При компиляции open_acct.m и transfer.m в отдельные пакеты, вы не можете перевести средства, используя счета, созданные с open_acct. Вызов transfer выбрасывает исключение. Одним из способов решения этой проблемы является компиляция обеих функций в один пакет. Можно также переформатировать приложение так, чтобы объекты MATLAB не передавались функциям.

Примечание

Эту ситуацию можно также обработать с помощью одиночной среды выполнения MATLAB.

Связанные темы