matlab-ruby 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -1
- data/README.txt +6 -6
- data/lib/matlab/driver/native/conversions.rb +51 -9
- data/lib/matlab/engine.rb +24 -9
- data/lib/matlab/version.rb +2 -2
- data/test/driver/native/test_conversions.rb +18 -4
- data/test/test_engine.rb +14 -4
- metadata +57 -46
data/History.txt
CHANGED
@@ -1,7 +1,20 @@
|
|
1
|
+
== 2.0.0 / 2008-01-03
|
2
|
+
|
3
|
+
* 1 bug fix
|
4
|
+
* Added NilClass to_ruby method.
|
5
|
+
* 3 changes
|
6
|
+
* Removed dynamic variable name setters/getters in favor of put_variable, get_variable methods.
|
7
|
+
* 1 dimensional MATLAB matrices are now converted into a normal Ruby Arrays.
|
8
|
+
* 1 dimensional MATLAB struct matrices are now converted into normal Ruby Hashes.
|
9
|
+
* 3 enhancements
|
10
|
+
* MATLAB functions may now be executed directly from the engine instead of having to use eval_string.
|
11
|
+
* Ruby Arrays are now converted into 1 dimensional MATLAB matrices.
|
12
|
+
* Ruby Hashes are now converted into 1 dimensional MATLAB struct matrices.
|
13
|
+
|
1
14
|
== 1.0.1 / 2007-04-27
|
2
15
|
|
3
16
|
* 1 bug fix
|
4
|
-
* Need to check for nil value during MATLAB to Ruby StructMatrix conversion otherwise it segfaults
|
17
|
+
* Need to check for nil value during MATLAB to Ruby StructMatrix conversion otherwise it segfaults.
|
5
18
|
|
6
19
|
== 1.0.0 / 2007-04-06
|
7
20
|
|
data/README.txt
CHANGED
@@ -17,16 +17,16 @@ A Ruby interface to the MATLAB interpreted language.
|
|
17
17
|
require 'matlab'
|
18
18
|
|
19
19
|
engine = Matlab::Engine.new
|
20
|
-
engine.x
|
21
|
-
engine.y
|
22
|
-
engine.
|
23
|
-
engine.z
|
20
|
+
engine.put_variable "x", 123.456
|
21
|
+
engine.put_variable "y", 789.101112
|
22
|
+
engine.eval "z = x * y"
|
23
|
+
engine.get_variable "z"
|
24
24
|
|
25
25
|
matrix = Matlab::Matrix.new(20, 400)
|
26
26
|
20.times { |m| 400.times { |n| matrix[m, n] = rand } }
|
27
|
-
engine.m
|
27
|
+
engine.put_variable "m", matrix
|
28
28
|
|
29
|
-
engine.
|
29
|
+
engine.save "/tmp/20_x_400_matrix"
|
30
30
|
engine.close
|
31
31
|
|
32
32
|
== REQUIREMENTS:
|
@@ -27,6 +27,10 @@ class NilClass
|
|
27
27
|
def to_matlab
|
28
28
|
Matlab::Driver::Native::API.mxGetNaN
|
29
29
|
end
|
30
|
+
|
31
|
+
def to_ruby
|
32
|
+
nil
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
class Float
|
@@ -44,18 +48,44 @@ class Numeric
|
|
44
48
|
end
|
45
49
|
|
46
50
|
class Array
|
51
|
+
# Converts the array into a 1 Dimensional MATLAB numeric or cell matrix
|
52
|
+
def to_matlab
|
53
|
+
if all? { |value| value.kind_of?(Numeric) || value.nil? }
|
54
|
+
matrix = Matlab::Matrix.new(size, 1)
|
55
|
+
|
56
|
+
each_with_index do |value, index|
|
57
|
+
matrix[index, 0] = value
|
58
|
+
end
|
59
|
+
matrix.to_matlab
|
60
|
+
else
|
61
|
+
to_cell_matrix.to_matlab
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
47
65
|
# Flattens and converts the array to a 1 Dimensional Matlab::CellMatrix
|
48
66
|
def to_cell_matrix
|
49
|
-
|
50
|
-
cell_matrix = Matlab::CellMatrix.new(values.size, 1)
|
67
|
+
cell_matrix = Matlab::CellMatrix.new(size, 1)
|
51
68
|
|
52
|
-
|
69
|
+
each_with_index do |value, index|
|
53
70
|
cell_matrix[index, 0] = value
|
54
71
|
end
|
55
72
|
cell_matrix
|
56
73
|
end
|
57
74
|
end
|
58
75
|
|
76
|
+
class Hash
|
77
|
+
# Converts the hash into a 1 Dimensional MATLAB struct matrix
|
78
|
+
def to_matlab
|
79
|
+
struct_matrix = Matlab::StructMatrix.new(1, 1, *keys)
|
80
|
+
|
81
|
+
each do |(key, value)|
|
82
|
+
struct_matrix[0,0][key] = value
|
83
|
+
end
|
84
|
+
|
85
|
+
struct_matrix.to_matlab
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
59
89
|
module Matlab
|
60
90
|
class Matrix
|
61
91
|
# Converts the matrix into a MATLAB numeric matrix
|
@@ -75,7 +105,7 @@ module Matlab
|
|
75
105
|
matrix
|
76
106
|
end
|
77
107
|
|
78
|
-
# Creates a Matlab::Matrix from a MATLAB numeric matrix
|
108
|
+
# Creates a Matlab::Matrix or Ruby Array from a MATLAB numeric matrix
|
79
109
|
def self.from_matlab(matrix)
|
80
110
|
m = Matlab::Driver::Native::API.mxGetM(matrix)
|
81
111
|
n = Matlab::Driver::Native::API.mxGetN(matrix)
|
@@ -91,7 +121,11 @@ module Matlab
|
|
91
121
|
end
|
92
122
|
end
|
93
123
|
|
94
|
-
|
124
|
+
if m == 1 || n == 1
|
125
|
+
matlab_matrix.cells.flatten
|
126
|
+
else
|
127
|
+
matlab_matrix
|
128
|
+
end
|
95
129
|
end
|
96
130
|
end
|
97
131
|
|
@@ -112,7 +146,7 @@ module Matlab
|
|
112
146
|
matrix
|
113
147
|
end
|
114
148
|
|
115
|
-
# Creates a Matlab::CellMatrix from a MATLAB cell matrix
|
149
|
+
# Creates a Matlab::CellMatrix or Ruby Array from a MATLAB cell matrix
|
116
150
|
def self.from_matlab(matrix)
|
117
151
|
m = Matlab::Driver::Native::API.mxGetM(matrix)
|
118
152
|
n = Matlab::Driver::Native::API.mxGetN(matrix)
|
@@ -128,7 +162,11 @@ module Matlab
|
|
128
162
|
end
|
129
163
|
end
|
130
164
|
|
131
|
-
|
165
|
+
if m == 1 || n == 1
|
166
|
+
cell_matrix.cells.collect { |cell| cell.first }
|
167
|
+
else
|
168
|
+
cell_matrix
|
169
|
+
end
|
132
170
|
end
|
133
171
|
end
|
134
172
|
|
@@ -152,7 +190,7 @@ module Matlab
|
|
152
190
|
matrix
|
153
191
|
end
|
154
192
|
|
155
|
-
# Creates a Matlab::StructMatrix from a MATLAB struct matrix
|
193
|
+
# Creates a Matlab::StructMatrix or Ruby Hash from a MATLAB struct matrix
|
156
194
|
def self.from_matlab(matrix)
|
157
195
|
m = Matlab::Driver::Native::API.mxGetM(matrix)
|
158
196
|
n = Matlab::Driver::Native::API.mxGetN(matrix)
|
@@ -171,7 +209,11 @@ module Matlab
|
|
171
209
|
end
|
172
210
|
end
|
173
211
|
|
174
|
-
|
212
|
+
if m == 1 && n == 1
|
213
|
+
struct_matrix.cells.flatten.first
|
214
|
+
else
|
215
|
+
struct_matrix
|
216
|
+
end
|
175
217
|
end
|
176
218
|
end
|
177
219
|
end
|
data/lib/matlab/engine.rb
CHANGED
@@ -7,10 +7,10 @@ module Matlab
|
|
7
7
|
#
|
8
8
|
# engine = Matlab::Engine.new
|
9
9
|
#
|
10
|
-
# engine.x
|
11
|
-
# engine.y
|
12
|
-
# engine.
|
13
|
-
# p engine.z
|
10
|
+
# engine.put_variable "x", 123.456
|
11
|
+
# engine.put_variable "y", 789.101112
|
12
|
+
# engine.eval "z = x * y"
|
13
|
+
# p engine.get_variable "z"
|
14
14
|
#
|
15
15
|
# engine.close
|
16
16
|
#
|
@@ -35,15 +35,30 @@ module Matlab
|
|
35
35
|
@driver.eval_string(@handle, string)
|
36
36
|
end
|
37
37
|
|
38
|
-
#
|
38
|
+
# Put a value to MATLAB via a given name
|
39
|
+
def put_variable(name, value)
|
40
|
+
@driver.put_variable(@handle, name, value)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Get a value from MATLAB via a given name
|
44
|
+
def get_variable(name)
|
45
|
+
@driver.get_variable(@handle, name)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Call a MATLAB function passing in the arguments
|
39
49
|
def method_missing(method_id, *args)
|
40
50
|
method_name = method_id.id2name
|
41
51
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
52
|
+
variable_names = []
|
53
|
+
args.each_with_index do |arg, index|
|
54
|
+
variable_names << variable_name = "mr#{index}_#{method_name}"
|
55
|
+
put_variable(variable_name, arg)
|
46
56
|
end
|
57
|
+
|
58
|
+
eval_string("#{method_name}(#{variable_names.join(", ")})")
|
59
|
+
result = get_variable("ans")
|
60
|
+
eval_string("clear #{variable_names.join(" ")}")
|
61
|
+
result
|
47
62
|
end
|
48
63
|
|
49
64
|
# Closes this engine
|
data/lib/matlab/version.rb
CHANGED
@@ -33,15 +33,29 @@ class ConversionsTest < Test::Unit::TestCase
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_array_to_cell_matrix
|
36
|
-
cell_matrix = Matlab::CellMatrix.new(
|
37
|
-
9.times { |i| cell_matrix[i, 0] = (i > 4 ? i : i.to_s) }
|
36
|
+
cell_matrix = Matlab::CellMatrix.new(7, 1)
|
38
37
|
cell_matrix[0, 0] = true
|
39
|
-
cell_matrix[
|
40
|
-
cell_matrix[
|
38
|
+
cell_matrix[1, 0] = "1"
|
39
|
+
cell_matrix[2, 0] = "2"
|
40
|
+
cell_matrix[3, 0] = ["3", nil, 5]
|
41
|
+
cell_matrix[4, 0] = 6
|
42
|
+
cell_matrix[5, 0] = 7
|
43
|
+
cell_matrix[6, 0] = false
|
41
44
|
|
42
45
|
assert_equal cell_matrix, [true, "1", "2", ["3", nil, 5], 6, 7, false].to_cell_matrix
|
43
46
|
end
|
44
47
|
|
48
|
+
def test_array_to_matlab_to_ruby
|
49
|
+
assert_equal [1.0, nil, 3.0], [1, nil, 3.0].to_matlab.to_ruby
|
50
|
+
assert_equal [1.0, "2", false, ["foo", "bar", "baz"]], [1, "2", false, ["foo", "bar", "baz"]].to_matlab.to_ruby
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_hash_to_matlab_to_ruby
|
54
|
+
assert_equal({"foo" => "bar"}, {"foo" => "bar"}.to_matlab.to_ruby)
|
55
|
+
assert_equal({"foo" => [1.0,2.0,3.0]}, {"foo" => [1,2,3]}.to_matlab.to_ruby)
|
56
|
+
assert_equal({"foo" => { "bar" => [1.0,2.0,3.0, [4.0,5.0,6.0]] }}, {"foo" => { "bar" => [1,2,3, [4,5,6]] }}.to_matlab.to_ruby)
|
57
|
+
end
|
58
|
+
|
45
59
|
def test_matlab_matrix_to_matlab_to_ruby
|
46
60
|
matrix = Matlab::Matrix.new(3, 3)
|
47
61
|
3.times { |m| 3.times { |n| matrix[m, n] = rand } }
|
data/test/test_engine.rb
CHANGED
@@ -65,13 +65,23 @@ class EngineTest < Test::Unit::TestCase
|
|
65
65
|
@engine.close
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def test_get_variable
|
69
69
|
@driver.expects(:get_variable).with(@handle, "x")
|
70
|
-
@engine.x
|
70
|
+
@engine.get_variable("x")
|
71
71
|
end
|
72
72
|
|
73
|
-
def
|
73
|
+
def test_put_variable
|
74
74
|
@driver.expects(:put_variable).with(@handle, "y", 123.456)
|
75
|
-
@engine.y
|
75
|
+
@engine.put_variable("y", 123.456)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_method_missing
|
79
|
+
@engine.expects(:put_variable).with("mr0_rand", 2)
|
80
|
+
@engine.expects(:put_variable).with("mr1_rand", 4)
|
81
|
+
@engine.expects(:eval_string).with("rand(mr0_rand, mr1_rand)")
|
82
|
+
@engine.expects(:get_variable).with("ans").returns("The Answer")
|
83
|
+
@engine.expects(:eval_string).with("clear mr0_rand mr1_rand")
|
84
|
+
|
85
|
+
assert_equal "The Answer", @engine.rand(2, 4)
|
76
86
|
end
|
77
87
|
end
|
metadata
CHANGED
@@ -1,35 +1,38 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.2
|
3
|
-
specification_version: 1
|
4
2
|
name: matlab-ruby
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version:
|
7
|
-
date: 2007-04-27 00:00:00 -06:00
|
8
|
-
summary: A Ruby interface to the Matlab interpreted language.
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
- ext
|
12
|
-
email:
|
13
|
-
- jonathan.younger@lipomics.com
|
14
|
-
homepage: http://matlab-ruby.rubyforge.org/
|
15
|
-
rubyforge_project: matlab-ruby
|
16
|
-
description: "== USAGE: require 'matlab' engine = Matlab::Engine.new engine.x = 123.456 engine.y = 789.101112 engine.eval_string \"z = x * y\" engine.z matrix = Matlab::Matrix.new(20, 400) 20.times { |m| 400.times { |n| matrix[m, n] = rand } } engine.m = matrix engine.eval_string \"save '/tmp/20_x_400_matrix\" engine.close == REQUIREMENTS: * MATLAB * GCC or some other compiler to build the included extension * SWIG (If you want to recompile the SWIG wrapper) * Mocha (For testing only)"
|
17
|
-
autorequire:
|
18
|
-
default_executable:
|
19
|
-
bindir: bin
|
20
|
-
has_rdoc: true
|
21
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
22
|
-
requirements:
|
23
|
-
- - ">"
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version: 0.0.0
|
26
|
-
version:
|
4
|
+
version: 2.0.0
|
27
5
|
platform: ruby
|
28
|
-
signing_key:
|
29
|
-
cert_chain:
|
30
|
-
post_install_message:
|
31
6
|
authors:
|
32
7
|
- Jonathan Younger
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-01-07 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hoe
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.4.0
|
23
|
+
version:
|
24
|
+
description: "== USAGE: require 'matlab' engine = Matlab::Engine.new engine.put_variable \"x\", 123.456 engine.put_variable \"y\", 789.101112 engine.eval \"z = x * y\" engine.get_variable \"z\" matrix = Matlab::Matrix.new(20, 400) 20.times { |m| 400.times { |n| matrix[m, n] = rand } } engine.put_variable \"m\", matrix engine.save \"/tmp/20_x_400_matrix\" engine.close == REQUIREMENTS: * MATLAB * GCC or some other compiler to build the included extension * SWIG (If you want to recompile the SWIG wrapper) * Mocha (For testing only)"
|
25
|
+
email:
|
26
|
+
- jonathan.younger@lipomics.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions:
|
30
|
+
- ext/matlab_api/extconf.rb
|
31
|
+
extra_rdoc_files:
|
32
|
+
- History.txt
|
33
|
+
- LICENSE.txt
|
34
|
+
- Manifest.txt
|
35
|
+
- README.txt
|
33
36
|
files:
|
34
37
|
- History.txt
|
35
38
|
- LICENSE.txt
|
@@ -50,27 +53,35 @@ files:
|
|
50
53
|
- test/driver/native/test_conversions.rb
|
51
54
|
- test/driver/native/test_driver.rb
|
52
55
|
- test/test_engine.rb
|
56
|
+
has_rdoc: true
|
57
|
+
homepage: http://matlab-ruby.rubyforge.org/
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options:
|
60
|
+
- --main
|
61
|
+
- README.txt
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
- ext
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: "0"
|
70
|
+
version:
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: "0"
|
76
|
+
version:
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project: matlab-ruby
|
80
|
+
rubygems_version: 1.0.1
|
81
|
+
signing_key:
|
82
|
+
specification_version: 2
|
83
|
+
summary: A Ruby interface to the Matlab interpreted language.
|
53
84
|
test_files:
|
54
85
|
- test/driver/native/test_conversions.rb
|
55
86
|
- test/driver/native/test_driver.rb
|
56
87
|
- test/test_engine.rb
|
57
|
-
rdoc_options: []
|
58
|
-
|
59
|
-
extra_rdoc_files: []
|
60
|
-
|
61
|
-
executables: []
|
62
|
-
|
63
|
-
extensions:
|
64
|
-
- ext/matlab_api/extconf.rb
|
65
|
-
requirements: []
|
66
|
-
|
67
|
-
dependencies:
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
name: hoe
|
70
|
-
version_requirement:
|
71
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 1.2.0
|
76
|
-
version:
|