MatlabControl is not required any more
This commit is contained in:
parent
197b4b5e6b
commit
4ecb9e9841
@ -1,284 +0,0 @@
|
||||
package javaeva.tools;
|
||||
|
||||
/* MatlabControl.java
|
||||
*
|
||||
* "Copyright (c) 2001 and The Regents of the University
|
||||
* of California. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for any purpose, without fee, and without written agreement is
|
||||
* hereby granted, provided that the above copyright notice and the following
|
||||
* two paragraphs appear in all copies of this software.
|
||||
*
|
||||
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
|
||||
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
||||
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
|
||||
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
|
||||
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
|
||||
*
|
||||
* $\Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class interfaces with the current Matlab session, allowing you
|
||||
* to call matlab commands from Java objects
|
||||
*
|
||||
* @author <a href="mailto:kamin@cs.berkeley.edu">Kamin Whitehouse</a>
|
||||
*/
|
||||
|
||||
import com.mathworks.jmi.*;
|
||||
|
||||
public class MatlabControl {
|
||||
Matlab matlab = null; //this is the com.mathworks.jmi.Matlab class,which has functionality allowing one to interact with the matlab session.
|
||||
boolean useCb=false;
|
||||
Object returnVal;
|
||||
String callbackFunction;
|
||||
|
||||
/***************CONSTRUCTORS****************/
|
||||
/*** usually, the default constructor with no arguments is fine.
|
||||
* Sometimes, a callback function is useful. A callback function
|
||||
* allows the user to pass the command and its arguments to a
|
||||
* matlab function, which will figure out the best way to execute
|
||||
* it, instead of trying to execute it directly from java. This
|
||||
* is often useful for handling/printing errors as well as dealing
|
||||
* with native matlab data types, like cell arrays. The cell
|
||||
* array is not really converted to a java type, only the handle
|
||||
* of the cell array is converted to a java type, so often a
|
||||
* matlab callback function is useful for dealing specially with
|
||||
* cell arrays, etc.
|
||||
***/
|
||||
|
||||
public MatlabControl() {
|
||||
this(false);
|
||||
}
|
||||
|
||||
public Matlab getMatlab() {
|
||||
return matlab;
|
||||
}
|
||||
|
||||
public MatlabControl(boolean useCallback) {
|
||||
this(useCallback,new String("matlabControlcb"));
|
||||
}
|
||||
|
||||
public MatlabControl(boolean useCallback, String CallBackFunction) {
|
||||
try {
|
||||
if (matlab == null)
|
||||
matlab = new Matlab();//this command links to the current matlab session
|
||||
} catch (Exception e) {
|
||||
System.out.println(e.toString());
|
||||
}
|
||||
returnVal = new String("noReturnValYet");
|
||||
this.useCb=useCallback;
|
||||
callbackFunction=CallBackFunction;
|
||||
}
|
||||
|
||||
/***************USER-LEVEL FUNCTIONS****************/
|
||||
/***call these from any java thread (as long as the thread
|
||||
* originated from within matlab)
|
||||
***/
|
||||
|
||||
/**Evaluate a string, Matlab script, or Matlab function**/
|
||||
public void eval(String Command) {
|
||||
Matlab.whenMatlabReady(new MatlabEvalCommand(Command,useCb));
|
||||
}
|
||||
|
||||
/**Evaluate a Matlab function that requires arguments. Each element of
|
||||
the "args" vector is an argument to the function "Command"**/
|
||||
public void feval(String Command, Object[] args) {
|
||||
Matlab.whenMatlabReady(new MatlabFevalCommand(Command, args,useCb));
|
||||
}
|
||||
|
||||
/**Evaluate a Matlab function that requires arguments and provide return arg.
|
||||
* Each element of the "args" vector is an argument to the function "Command"**/
|
||||
public Object blockingFeval(String Command, Object[] args) throws InterruptedException {
|
||||
returnVal = new String("noReturnValYet");
|
||||
Matlab.whenMatlabReady(new MatlabBlockingFevalCommand(Command, args, useCb, this));
|
||||
if (returnVal.equals("noReturnValYet")) {
|
||||
synchronized(returnVal){
|
||||
returnVal.wait();
|
||||
}
|
||||
}
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
/**Echoing the eval statement is useful if you want to see in
|
||||
* matlab each time that a java function tries to execute a matlab
|
||||
* command **/
|
||||
public void setEchoEval(boolean echo){
|
||||
Matlab.setEchoEval(echo);
|
||||
}
|
||||
|
||||
/**********TEST FUNCTIONS***********************/
|
||||
/***call these functions from within Matlab itself. These are examples of the general execution order:
|
||||
1. instantiate java object from matlab
|
||||
2. spawn a new Java thread
|
||||
3. call matlab functions from new java thread
|
||||
|
||||
EXAMPLE (from matlab prompt):
|
||||
|
||||
>> mc=MatlabControl;
|
||||
>> mc.testEval('x = 5')
|
||||
x =
|
||||
5
|
||||
> mc.testFeval('help',{'sqrt'})
|
||||
SQRT Square root.
|
||||
SQRT(X) is the square root of the elements of X. Complex
|
||||
results are produced if X is not positive.
|
||||
|
||||
See also SQRTM.
|
||||
|
||||
Overloaded methods
|
||||
help sym/sqrt.m
|
||||
|
||||
>> mc.testBlockingFeval('sqrt',{x})
|
||||
2.2361
|
||||
****/
|
||||
|
||||
public void testEval(final String Command) {
|
||||
class Caller extends Thread{
|
||||
public void run(){
|
||||
try{
|
||||
eval(Command);
|
||||
} catch(Exception e){
|
||||
// System.out.println(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
Caller c = new Caller();
|
||||
c.start();
|
||||
}
|
||||
|
||||
public void testFeval(final String Command, final Object[] args) {
|
||||
class Caller extends Thread{
|
||||
public void run(){
|
||||
try{
|
||||
feval(Command, args);
|
||||
} catch(Exception e){
|
||||
// System.out.println(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
Caller c = new Caller();
|
||||
c.start();
|
||||
}
|
||||
|
||||
public void testBlockingFeval(final String Command, final Object[] args) {
|
||||
class Caller extends Thread{
|
||||
public void run(){
|
||||
try{
|
||||
Object rets[] = new Object[1];
|
||||
rets[0] = blockingFeval(Command, args);
|
||||
feval("disp",rets );
|
||||
} catch(Exception e){
|
||||
// System.out.println(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
Caller c = new Caller();
|
||||
c.start();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******** INTERNAL FUNCTIONS AND CLASSES *******/
|
||||
|
||||
public void setReturnVal(Object val) {
|
||||
synchronized(returnVal){
|
||||
Object oldVal = returnVal;
|
||||
returnVal = val;
|
||||
oldVal.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
/** This class is used to execute a string in Matlab **/
|
||||
protected class MatlabEvalCommand implements Runnable {
|
||||
String command;
|
||||
boolean useCallback,eval;
|
||||
Object[] args;
|
||||
|
||||
public MatlabEvalCommand(String Command, boolean useCallback) {
|
||||
command = Command;
|
||||
this.useCallback = useCallback;
|
||||
eval=true;
|
||||
args=null;
|
||||
}
|
||||
|
||||
protected Object useMatlabCommandCallback(String command, Object[] args){
|
||||
int numArgs = (args==null)? 0 : args.length;
|
||||
Object newArgs[] = new Object[numArgs+1] ;
|
||||
newArgs[0]=command;
|
||||
for(int i=0;i<numArgs;i++){
|
||||
newArgs[i+1] = args[i];
|
||||
}
|
||||
try{
|
||||
return Matlab.mtFevalConsoleOutput(callbackFunction, newArgs, 0);
|
||||
}
|
||||
catch(Exception e){
|
||||
System.out.println(e.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
if(useCallback){
|
||||
useMatlabCommandCallback(command, args);
|
||||
}
|
||||
else if(eval){
|
||||
matlab.evalConsoleOutput(command);
|
||||
}
|
||||
else{
|
||||
matlab.fevalConsoleOutput(command, args);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** This class is used to execute a function in matlab and pass parameters**/
|
||||
protected class MatlabFevalCommand extends MatlabEvalCommand {
|
||||
|
||||
public MatlabFevalCommand(String Command, Object[] Args, boolean useCallback) {
|
||||
super(Command, useCallback);
|
||||
args = Args;
|
||||
eval=false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** This class is used to execute a function in matlab and pass parameters
|
||||
* and it also return arguments**/
|
||||
protected class MatlabBlockingFevalCommand extends MatlabFevalCommand {
|
||||
MatlabControl parent;
|
||||
|
||||
public MatlabBlockingFevalCommand(String Command, Object[] Args, boolean useCallback, MatlabControl parent) {
|
||||
super(Command, Args, useCallback);
|
||||
this.parent=parent;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
if(useCallback){
|
||||
parent.setReturnVal(useMatlabCommandCallback(command, args));
|
||||
}
|
||||
else{
|
||||
//parent.setReturnVal(matlab.evalConsoleOutput(command));
|
||||
parent.setReturnVal(Matlab.mtFevalConsoleOutput(command, args, 0));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// System.out.println(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user