MATLAB Answers

0

Matlabで構築し​た関数のwebアプリ​ケーション(html​, javascript​内で使用するなど)へ​の導入について

Asked by Yuto Omae on 12 Nov 2017
Latest activity Edited by Kojiro Saito on 14 May 2019
Matlabを使用し、機械学習による判定モデル(Model)を構築しました。 Matlab内では、
Res = predict(Model,[x x x]);
のように記述すると、判定モデル(Model)に、x x xが入力されたときの判定結果がResに貯蔵されると思います。 このように、何らかの入力を行った後、Matlab上で構築済みのモデルで出力を得るような関数があります。 こちらを、javascriptなどを経由してwebアプリケーションとして使用したいのですが、どのような方法が考えられるでしょうか。 MATLAB Compilerを購入すると可能になるのでしょうか。
よろしくお願いします。

  0 Comments

Sign in to comment.

2 Answers

Answer by Kojiro Saito on 13 Nov 2017
Edited by Kojiro Saito on 14 May 2019
 Accepted Answer

いくつか方法がありますが、MATLAB Production Serverを使う方法が実装が楽で拡張性も高いです。それ以外にもMATLAB CompilerやCompiler SDKでMATLABスクリプトを実行ファイルやライブラリファイルにしてサーバーに置き、サーバーアプリケーション(NodeJS、PHPやJavaなど)からキックする方法などがあります。
(1) MATLAB Production Serverを使った方法
下記の(2)や(3)の方法ではMATLAB Runtimeの起動時間が掛かったり、ユーザー数が増えて同時アクセスが大量に来た場合にサーバーのリソースが枯渇したりするのがネックになります。その際には MATLAB Production Server というサーバー製品を使うのがオススメです。RESTful APIというWebアプリケーションでよく使われるAPIがサポートされていたり、Java、Python、.NET、C++などからのアクセスもできるようになっているので、Webアプリケーションとの親和性が高く、インタフェースの実装に掛かる手間も少なくて済みます。また、キューイングの機能やMATLAB Runtimeの起動時間がないという特徴があるのでユーザーからの大量の同時アクセスに対して待ち時間なく処理を返すことができるようになります。
(2) MATLAB Compilerを使った方法
MATLAB ComilerでMATLABのスクリプトからスタンドアロンのアプリケーション(Windowsならexeファイル、Linuxならshファイル)が作成できますので、これをサーバー側に置き、サーバープログラムから実行します。 ここでは簡単な例として、魔方陣行列をリターンするMATLABスクリプトをexeファイルに変換し、サーバープログラムとしてNodeJSを用いたWebアプリケーションの作成法を記します。MATLABスクリプトで結果をファイル(ここではresult.csv)に保存し、これをサーバープログラムから読み込ませます。
コンパイルするMATLABのスクリプト(magicSquare.m)
function out = magicSquare(n)
if ischar(n)
n = str2num(n);
end
out = magic(n);
disp(out)
csvwrite('result.csv', out);
これをMATLAB CompilerでコンパイルしてmagicSquare.exeを作成し、後述するapp.jsと同じフォルダーに置きます。また、サーバーマシンにコンパイルしたMATLABと同じバージョンのMATLAB Runtimeをインストールする必要があります。インストーラーは こちら にあります。
サーバープログラム(NodeJSのapp.js)
var express = require('express');
var app = express();
var path = require('path');
var fs = require('fs');
var csv = require('comma-separated-values');
var child_process = require('child_process');
var qs = require('querystring');
app.use(express.static(path.join(__dirname, 'public')));
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.post('/execMatlab', function (req, res) {
var body = '';
req.on('data', function (data) {
body += data;
});
req.on('end', function () {
var inputData = qs.parse(body);
// execFile: executes a file with the specified arguments
child_process.execFile('magicSquare.exe', [String(inputData.inputNum)], function (error, stdout, stderr) {
// If error occurs
if (error) {
console.error('stderr', stderr);
throw error;
}
console.log(stdout.toString());
var csvData = fs.readFileSync('result.csv', 'utf-8');
var resultData = [];
var csvArray = new csv(csvData);
csvArray.forEach(function (array) {
resultData.push(array);
});
res.writeHead(200, {'content-type': 'application/json'});
res.end(JSON.stringify(resultData));
});
});
});
// Listener
var server = app.listen(3000, function () {
console.log('Server listening on port 3000');
});
クライアント(index.html)
<!DOCTYPE html>
<html>
<head>
<title>Magic Square</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
</head>
<body>
<div>
Matrix Order: <input type="number" id="inputNum" value="5" required/><br/>
<button onclick="exec()">Run</button>
</div>
<div id="result"><div class="data"></div></div>
<script>
function exec() {
var inputNum = $("#inputNum").val();
$.post('/execMatlab', {inputNum: inputNum}, function (data) {
console.log('SUCCESS');
console.log(data);
var displayResult = '';
for (var i = 0; i < data.length; i++) {
displayResult += String(data[i]) + '<br/>';
}
$(".data").replaceWith(displayResult);
}
)
};
</script>
</body>
</html>
サーバー側でNodeJSのライブラリなどをインストール(npm install)した後に、プログラムを実行します。
node app.js
WebブラウザからサーバーのURL(下記の例ではhttp://localhost:3000)にアクセスし、画面からRunボタンを実行することでmagicSquare.exeからリターンされる魔方陣行列が表示されます。
(3) MATLAB Compiler SDKを使った方法
MATLAB Compiler SDKは共有ライブラリを作成できますので、MATLABスクリプトを例えばJavaやPythonなどのライブラリに変換し、JavaやPythonなどのサーバープログラムと連携してキックすることができます。
2019/5/14 更新
(4) MATLAB Compilerを使ってWebアプリを作成する方法
R2018aから、MATLAB Compilerを使用して、App Designerで作成したアプリ(.mlapp)からWebアプリを作成することができるようになりました。Webアプリは、MATLAB Compilerに含まれるWebアプリサーバー上で動作させることができます。
セキュリティの関係からインターネット上ではなくイントラネット上での使用が推奨されていますが、App Designerで作成したGUIのアプリケーションを、HTMLやJavaScriptなどを書くことなく手軽にWebアプリケーション化できます。手元にApp Designerのアプリが無い場合でも、ドキュメントにWebアプリのサンプルもありますのですぐにお試しいただけます。

  0 Comments

Sign in to comment.


Answer by Yuto Omae on 19 Dec 2017

お世話になります。質問者です。 諸事情で.sh拡張子での実行ファイルが欲しいのですが、windows版のMatlab Compilerですと、exe拡張子になってしまいます。 問い合わせたところ、WindowsやMac OSXだと.sh拡張子にはならないとのことでした。 UbuntuでMatlab Compilerを使用すると.sh拡張子ができるのでしょうか?
どうぞよろしくお願い致します。

  1 Comment

MATLAB Compilerはクロスプラットフォームのコンパイルをサポートしていないため、Linux環境で実行できる実行ファイルを作成するには、Linuxでコンパイルする必要があります。
UbuntuでMATLAB Compilerを使用してコンパイルすれば実行ファイルのバイナリ(拡張子無しのファイル)と、ラッパー(.sh)が作成されます。

Sign in to comment.