Skip to content
SergeyAnkarenko edited this page Jul 6, 2016 · 8 revisions

Способ 1. Коммуникация через Runtime класс.

!!! Взято отсюда Лично у меня этот метод не заработал. Программа крутилась в цикле в ожидании сообщения от 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 нужно делать вручную.

Способ 2: Using a JNI Wrapper for Matlab’s C Engine.

Development

  1. Project structure
  2. Heroku
  3. Coding Guidelines

Вычисляемые статистики

Architecture

R

Matlab

Выбор базы данных

Angular 2

Источники данных

Random

  1. Interpolation
  2. [Charts comparison](displaying graphs control)
  3. What is Servlet?
  4. Ace-editor

GDS

  1. Библиотека CoreArray
  2. Сборка CoreArray
  3. Сравнение скоростей способов доступа к CoreArray
  4. Переделка Gdsfmt под java
  5. Разбор структуры файла из центра биоинформатики

Институт биоинформатики

Темы:

  1. Классические категориальные тесты на независимость

Clone this wiki locally