Структуры (или structs) являются массивами MATLAB® с элементами, к которым получают доступ текстовые полевые указатели.
Структуры состоят из контейнеров данных, названных fields. Каждое поле хранит массив некоторого типа данных MATLAB. Каждое поле имеет уникальное имя.
Поле в структуре может иметь значение, совместимое с любым типом данных MATLAB, включая массив ячеек или другую структуру.
В MATLAB структура создается можно следующим образом:
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'
S
) с тремя полями: S = name: 'Ed Plum' score: 83 grade: 'B+'
S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-';
(1,2)
создается. Структуры с дополнительными размерностями также поддержаны.Поскольку Java® исходно не поддерживает структуры MATLAB, упорядочивая структуры между сервером, и клиент включает дополнительное кодирование.
Структурам MATLAB упорядочивают списки пар "имя-значение". Вы представляете их на Java с использованием класса поля, состоящие из тех же чувствительных к регистру имен.
Класс Java должен также иметь public
get
и методы set
, заданные для каждого поля. Зависят ли потребности класса и get
и методы set
от того, используется ли он в качестве ввода или вывода или обоих.
Следующее является простым примером того, как структура MATLAB может быть упорядочена между клиентом и сервером Java.
В этом примере функция MATLAB sortstudents
берет в массиве структур (см. Маршала Структуры MATLAB (Структуры) на Java для деталей).
Каждый элемент в массиве структур представляет различную информацию о студенте. sortstudents
сортирует входной массив в порядке возрастания по счету каждого студента, можно следующим образом:
function sorted = sortstudents(unsorted) % Receive a vector of students as input % Get scores of all the students scores = {unsorted.score}; % Convert the cell array containing scores into a numeric array or doubles scores = cell2mat(scores); % Sort the scores array [s i] = sort(scores); % Sort the students array based on the sorted scores array sorted = unsorted(i);
Даже при том, что этот пример только использует поле scores
входной структуры, можно также работать с полями name
и grade
подобным образом.
Вы группируете sortstudents
в развертываемый архив (scoresorter.ctf
) с помощью приложения Production Server Compiler (см., Создают Развертываемый Архив для MATLAB Production Server для деталей), и сделайте его доступным на сервере в http://localhost:9910/scoresorter
для доступа клиентом Java (см. Долю Развертываемый Архив).
Прежде, чем задать интерфейс Java, требуемый клиентом, задайте структуру MATLAB, Student
, с помощью класса Java.
Student
объявляет поля name
, score
и grade
с соответствующими типами. Это также содержит public get
и функции set
, чтобы получить доступ к этим полям.
Затем, задайте интерфейс Java StudentSorter
, который вызывает метод sortstudents
и использует класс Student
, чтобы упорядочить вводы и выводы.
Поскольку вы работаете с типом struct, Student
должен быть включен в аннотацию MWStructureList
.
interface StudentSorter { @MWStructureList({Student.class}) Student[] sortstudents(Student[] students) throws IOException, MATLABException; }
Наконец, вы пишете приложение Java (MPSClientExample
) для клиента:
Создайте MWHttpClient
, и сопоставленный прокси (использование createProxy
) как показано в Создают Клиент Java.
Создайте неотсортированный студенческий массив структур на Java, который подражает struct MATLAB в именовании, количестве вводов и выводов, и введите валидность в MATLAB. Смотрите, что Клиент Java Кодирует Лучшые практики для получения дополнительной информации.
Сортировка студенческого массива и отображения это.
import java.net.URL; import java.io.IOException; import com.mathworks.mps.client.MWClient; import com.mathworks.mps.client.MWHttpClient; import com.mathworks.mps.client.MATLABException; import com.mathworks.mps.client.annotations.MWStructureList; interface StudentSorter { @MWStructureList({Student.class}) Student[] sortstudents(Student[] students) throws IOException, MATLABException; } public class ClientExample { public static void main(String[] args){ MWClient client = new MWHttpClient(); try{ StudentSorter s = client.createProxy(new URL("http://localhost:9910/scoresorter"), StudentSorter.class ); Student[] students = new Student[]{new Student("Toni Miller", 90, "A"), new Student("Ed Plum", 80, "B+"), new Student("Mark Jones", 85, "A-")}; Student[] sorted = s.sortstudents(students); System.out.println("Student list sorted in the ascending order of scores : "); for(Student st:sorted){ System.out.println(st); } }catch(IOException ex){ System.out.println(ex); }catch(MATLABException ex){ System.out.println(ex); }finally{ client.close(); } } }
Классы Java, которые представляют структуры MATLAB, используют Бобы Java, класс Introspector
(https://docs.oracle.com/javase/6/docs/api/java/beans/Introspector.html), чтобы сопоставить свойства с полями и его соглашениями о присвоении имен по умолчанию используется.
Это означает, что по умолчанию его метод decapitalize()
используется. Это сопоставляет первую букву от поля Java в строчную букву. По умолчанию не возможно задать поле Java, которое сопоставит с полем MATLAB, которое запускается с верхнего регистра.
Можно заменить это поведение путем реализации класса BeanInfo
с пользовательским методом getPropertyDescriptors()
. Например:
import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.beans.SimpleBeanInfo; public class StudentBeanInfo extends SimpleBeanInfo { @Override public PropertyDescriptor[] getPropertyDescriptors() { PropertyDescriptor[] props = new PropertyDescriptor[3]; try { // name uses default naming conventions so we do not need to // explicitly specify the accessor names. props[0] = new PropertyDescriptor("name",MyStruct.class); // score uses default naming conventions so we do not need to // explicitly specify the accessor names. props[1] = new PropertyDescriptor("score",MyStruct.class); // Grade uses a custom naming convention so we do need to // explicitly specify the accessor names. props[1] = new PropertyDescriptor("Grade",MyStruct.class, "getGrade","setGrade"); return props; } catch (IntrospectionException e) { e.printStackTrace(); } return null; } }
При определении структур Java как входных параметров следуйте этим инструкциям:
Гарантируйте, что поля в классе Java совпадают с именами полей в struct MATLAB точно. Имена полей являются чувствительными к регистру.
Используйте методы public get
на полях в классе Java. Зависят ли потребности класса и get
и методы set
для полей от того, используется ли он в качестве ввода или вывода или обоих. В этом примере обратите внимание, что, когда student
передается как вход методу sortstudents
, только методы get
для его полей используются, по условию упорядочивая алгоритм.
В результате, если класс Java задан для структуры MATLAB, которая используется только в качестве входного значения, методы set
не требуются. Эта версия класса Student
только представляет входные значения:
public class Student{ private String name; private int score; private String grade; public Student(String name, int score, String grade){ this.name = name; this.score = score; this.grade = grade; } public String getName(){ return name; } public int getScore(){ return score; } public String getGrade(){ return grade; } }
При определении структур Java как выходных параметров следуйте этим инструкциям:
Гарантируйте, что поля в классе Java совпадают с именами полей в struct MATLAB точно. Имена полей являются чувствительными к регистру.
Создайте новый экземпляр класса Java с помощью структуры, полученной от MATLAB. Сделайте так при помощи методов set
или аннотации @ConstructorProperties
, предоставленной Java. методы get
не требуются для класса Java при определении структур MATLAB только для вывода.
Класс Student
только для вывода с помощью методов set
следует:
public class Student{ private String name; private int score; private String grade; public void setName(String name){ this.name = name; } public void setScore(int score){ this.score = score; } public void setGrade(String grade){ this.grade = grade; } }
Класс Student
только для вывода с помощью @ConstructorProperties
следует:
public class Student{ private String name; private int score; private String grade; @ConstructorProperties({"name","score","grade"}) public Student(String n, int s, String g){ this.name = n; this.score = s; this.grade = g; } }
Если и методы set
и аннотация @ConstructorProperties
предоставлены, методы set
более приоритетны по сравнению с аннотацией @ConstructorProperties
.
Если класс Student
используется в качестве обоих ввод и вывод, необходимо предоставить методы get
, чтобы выполнить маршалинг к MATLAB. Для маршалинга из MATLAB используйте методы set
или аннотацию @ConstructorProperties
.