-
Notifications
You must be signed in to change notification settings - Fork 5
Java integration
!!! Взято отсюда Лично у меня этот метод не заработал. Программа крутилась в цикле в ожидании сообщения от matlab.
Используем Runtime класс, чтобы запустить процесс Matlab, с которым общаемся посредством потоков ввода и вывода.
Main.java. Главная часть.
import matlabRuntimeInterface.*;
public class Main
{
public static void main(String[] args)
{
Engine engine = new matlabRuntimeInterface.Engine();
try
{
engine.open("matlab -nosplash -nojvm");
System.out.println(engine.getOutputString(500));
engine.evalString("A = gallery(’lehmer’,10);");
engine.evalString("f = ones(10,1);");
engine.evalString("pcg(A,f,1e-5)");
System.out.println(engine.getOutputString(500));
engine.close();
}
catch (Exception e)
{
}
}
}Здесь показано использование интерфейса matlabRuntimeInterface. Оправляем строки, как если бы мы вводили их в самом Matlab. Перейдем к реализации matlabRuntimeInterface пакета. Он состоит из одного класса Engine.
Engine.Java. Объявление переменных и конструктора.
package MatlabRuntimeInterface;
import java.lang.Runtime;
import java.io.*;
public class Engine
{
private Process p;
private BufferedReader in;
private BufferedWriter out;
private BufferedReader err;
private char[] outputBuffer;
private static final int DEFAULT_SKIP = 65536;
private static final int DEFAULT_BUFFERSIZE = 65536;
private int totalCharsRead;
public Engine()
{
outputBuffer = new char[DEFAULT_BUFFERSIZE];
}
}p - процесс, с которым будем общаться.
in, out, err - потоки для общения.
outputBuffer - для хранения сообщений
Идем далее.
Engine.java. Open() метод
public void open(String startcmd) throws IOException
{
try
{
synchronized(this)
{
p = Runtime.getRuntime().exec(startcmd);
out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
}
// Wait for the Matlab process to respond.
receive();
}
catch(IOException e)
{
System.err.println("Matlab could not be opened.");
throw(e);
}
}Выполнение процесса и инициализация потоков для общения синхронизированы, чтобы избежать конфликтов. Ожидание ответа.
public void evalString(String str) throws IOException
{
send(str);
receive();
}Отсылаем запрос на вычисление и получаем ответ.
Engine.java. Send() метод
private void send(String str) throws IOException
{
try
{
str+="\n";
synchronized(this) {
out.write(str, 0, str.length());
out.flush();
}
}
catch(IOException e)
{
System.err.println("IOException occured while sending data to the" + " Matlab process.");
throw(e);
}
}Engine.java. receive() метод
private void receive() throws IOException
{
int charsRead = 0;
int numberToRead;
totalCharsRead = 0;
System.err.println("Receiving...");
try
{
synchronized(this)
{
while (totalCharsRead == 0)
{
while (in.ready())
{
if ((numberToRead = DEFAULT_BUFFERSIZE-totalCharsRead) > 0)
{
charsRead = in.read(outputBuffer,totalCharsRead,numberToRead);
if (charsRead > 0)
{
totalCharsRead += charsRead;
}
}
else
{
//skip();
return;
}
}
}
}
}
catch(IOException e)
{
System.err.println("IOException occured while receiving data from"+" the Matlab process.");
throw(e);
}
}И, наконец.
public String getOutputString (int numberOfChars)
{
if (totalCharsRead < numberOfChars)
numberOfChars = totalCharsRead;
char[] result = new char[numberOfChars];
System.arraycopy(outputBuffer, 0, result, 0, numberOfChars);
return new String(result);
}
public int close()
{
int code = p.exitValue();
p.destroy();
return code;
}Преимущества:
- Кроссплатформенность.
- Простота, мало кода.
- Ничего не надо устанавливать, никакой магии не требуется.
Недостатки:
- Передача информации по буквам, неэффективно с большими данными.
- Обработку результатов matlab нужно делать вручную.
- Project structure
- Heroku
- Coding Guidelines
- [Java](Coding Guidelines)
- Html
- Логирование (Java)
- Analyzers: [TEMPLATE]
- Общая схема вычисляемых функций
- Линейный коэффициент корреляции
- Уравнение линейной регрессии
- Анализ временных рядов
- Анализ одномерных временных рядов: вычисление тренда, сезонной и шумовой компонент несколькими способами
- Критерий Стьюдента
- Analyzers: Kolmogorov Smirnov Test for two samples
- Анализ главных компонент (Principal Component Analysis, PCA)
- Показатель Ляпунова для временных рядов
- Navigation
- REST API
- Классы - источники данных
- Добавление нового источника данных
- [Analyzers](Architecture of analize function)
- Analyzers (version 2)
- Пользователи, проекты и файлы
- Java R classic integration
- Renjin (R in JVM)
- R integration architecture
- R scripts
- RConfiguration
- Полезные функции в R
- Angular 2 in JavaScript
- Learning resources, etc.
- Angular 2 приложение проектов
- Точка входа для более быстрой разработки Angular 2 приложения
- Interpolation
- [Charts comparison](displaying graphs control)
- What is Servlet?
- Ace-editor
- Библиотека CoreArray
- Сборка CoreArray
- Сравнение скоростей способов доступа к CoreArray
- Переделка Gdsfmt под java
- Разбор структуры файла из центра биоинформатики