Click here to Skip to main content
12,403,130 members (70,491 online)
Click here to Skip to main content
Add your own
alternative version

Tagged as

Stats

33.7K views
1.2K downloads
30 bookmarked
Posted

OctaveSharp - Running GNU Octave with C#

, 10 Apr 2012 CPOL
Rate this:
Please Sign up or sign in to vote.
OctaveSharp wrapper for using Octave in C# applications

Introduction  

“GNU Octave is a high-level interpreted language, primarily intended for numerical computations. It provides capabilities for the numerical solution of linear and nonlinear problems, and for performing other numerical experiments. It also provides extensive graphics capabilities for data visualization and manipulation. Octave is normally used through its interactive command line interface, but it can also be used to write non-interactive programs. The Octave language is quite similar to Matlab so that most programs are easily portable.

Octave is distributed under the terms of the GNU General Public License. “

(Text and image above belong to http://www.gnu.org/software/octave/)

Recently I had to use some Octave scripts within a C# project I’m currently working on. After searching for a solution I had to implement my own Octave wrapper.

The basic idea is to start a process and redirect the standard input, output and error streams in order to execute random commands with the Octave interpreter. One common problem is that after successfully running a command, the interpreter blocks the output stream and there is no way to know when Octave finished its job. A solution to this problem is as follows: given the fact that the last line in the execution of the process is always available you can create a random string and make Octave echo this string every time you run another command; when parsing the output, an indication that the previous command is surly executed is when you encounter your echoed string.

Implementation

When starting the octave process a new random echo string is generated:

private string StartOctave(string PathToOctaveBinaries, bool CreateWindow) {
      this.OctaveEchoString = Guid.NewGuid().ToString();
      OctaveProcess = new Process();
      .
      .
      .
      OctaveProcess.OutputDataReceived +=
           new DataReceivedEventHandler(OctaveProcess_OutputDataReceived);
      OctaveProcess.BeginOutputReadLine();
      OctaveEntryText = ExecuteCommand(null);
 }  

When executing a random command the current thread blocks until a ManualResetEvent is triggered:

public string ExecuteCommand(string command) {
    if (OctaveProcess.HasExited)
        OctaveProcess.Start();
    SharedBuilder.Clear();
    if (command != null) {
        OctaveProcess.StandardInput.WriteLine(command);
    }
    //echo the random GUID string
    OctaveProcess.StandardInput.WriteLine("\""+ OctaveEchoString + "\"");
    OctaveDoneEvent.Reset();
    OctaveDoneEvent.WaitOne();
    return SharedBuilder.ToString();
}

And the asynchronous output data received puts all data in a StringBuilder until it comes across the echoed string.

void OctaveProcess_OutputDataReceived(object sender, DataReceivedEventArgs e) {
           if (e.Data == null) {
               SharedBuilder.Clear();
               SharedBuilder.Append("Octave has exited with the following error message: \r\n" + OctaveProcess.StandardError.ReadToEnd());
               OctaveDoneEvent.Set();
               return;
           }
           if (e.Data.Trim() == "ans = " + OctaveEchoString)
               OctaveDoneEvent.Set();
           else
               SharedBuilder.Append(e.Data + "\r\n");
       }

Using the code

Just create a new Octave class instance using one of the two constructors and pass on the full path to your octave installation.

After doing so, you can access the Octave command interpreter using the “ExecuteCommand” method. Reading results is done in the form of scalars(GetScalar), vectors(GetVector) and matrices(GetMatrix).

A simple script that calculates the transpose of a matrix is given below:

octave = new Octave(@"D:\Download\Soft\Octave3.6.0_gcc4.6.2\bin", false);
octave.ExecuteCommand("a=[1,2;3,4];");
octave.ExecuteCommand("result=a';");
double[][] m = octave.GetMatrix("result");

Hope this helps and if you use any of this work make sure to add a reference: Boros Tiberiu, OctaveSharp - running GNU Octave with C#, CodeProject, 2012

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Tiberiu Boros
Research Institute For Artificial Intelligence, Ro
Romania Romania
No Biography provided

You may also be interested in...

Comments and Discussions

 
QuestionOctave 4.0.0 compatibility Pin
Member 118567598-Sep-15 10:44
memberMember 118567598-Sep-15 10:44 
GeneralThanks! Pin
Paul Schlachter1-Aug-15 4:11
memberPaul Schlachter1-Aug-15 4:11 
QuestionImage processing package functions call Pin
Member 1043647927-Jan-15 2:43
memberMember 1043647927-Jan-15 2:43 
QuestionProblem with ProcessStart Arguments Pin
masamafaxen6-Jan-15 23:32
membermasamafaxen6-Jan-15 23:32 
QuestionFor complex value? Pin
Member 103291491-Dec-14 20:20
memberMember 103291491-Dec-14 20:20 
QuestionCode isn't working Pin
Member 110564963-Sep-14 10:01
memberMember 110564963-Sep-14 10:01 
QuestionUsing built-in libraries Pin
Member 1090395025-Jul-14 11:55
memberMember 1090395025-Jul-14 11:55 
QuestionFunctions work with cd Pin
Member 1090395030-Jun-14 0:12
memberMember 1090395030-Jun-14 0:12 
QuestionFunctions Pin
Member 1090395029-Jun-14 23:37
memberMember 1090395029-Jun-14 23:37 
AnswerRe: Functions Pin
Member 1095056216-Jul-14 2:45
memberMember 1095056216-Jul-14 2:45 
GeneralRe: Functions Pin
Member 1090395023-Jul-14 4:57
memberMember 1090395023-Jul-14 4:57 
SuggestionAbout the exit on error... Pin
Brisingr Aerowing7-Aug-13 8:04
professionalBrisingr Aerowing7-Aug-13 8:04 
GeneralRe: About the exit on error... Pin
MrButtle6-Oct-13 5:17
memberMrButtle6-Oct-13 5:17 
GeneralRe: About the exit on error... Pin
Brisingr Aerowing6-Oct-13 15:59
professionalBrisingr Aerowing6-Oct-13 15:59 
QuestionTutorial of implementation Pin
bukowski317-Jun-13 4:07
memberbukowski317-Jun-13 4:07 
QuestionOctaveSharp for ASP.NET Pin
Gerd Schluckebier1-Nov-12 1:26
memberGerd Schluckebier1-Nov-12 1:26 
AnswerRe: OctaveSharp for ASP.NET Pin
Tiberiu Boros6-Nov-12 11:00
memberTiberiu Boros6-Nov-12 11:00 
QuestionOctaveSharp Pin
CVision4-Sep-12 4:03
memberCVision4-Sep-12 4:03 
AnswerRe: OctaveSharp Pin
Tiberiu Boros4-Sep-12 8:12
memberTiberiu Boros4-Sep-12 8:12 
QuestionGetVector errors Pin
Member 76977543-Apr-12 22:13
memberMember 76977543-Apr-12 22:13 
AnswerRe: GetVector errors Pin
Tiberiu Boros10-Apr-12 9:51
memberTiberiu Boros10-Apr-12 9:51 
QuestionPlot 3D Pin
Member 874500820-Mar-12 1:32
memberMember 874500820-Mar-12 1:32 
AnswerRe: Plot 3D Pin
Tiberiu Boros23-Mar-12 4:32
memberTiberiu Boros23-Mar-12 4:32 
GeneralCool Pin
Xiang Zhai7-Mar-12 23:10
memberXiang Zhai7-Mar-12 23:10 
GeneralRe: Cool Pin
Tiberiu Boros8-Mar-12 0:49
memberTiberiu Boros8-Mar-12 0:49 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.160721.1 | Last Updated 10 Apr 2012
Article Copyright 2012 by Tiberiu Boros
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid