multiarray 0.21.0 → 0.22.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/multiarray.rb +4 -4
- data/lib/multiarray/components.rb +1 -1
- data/lib/multiarray/diagonal.rb +1 -1
- data/lib/multiarray/gccvalue.rb +9 -0
- data/lib/multiarray/operations.rb +34 -31
- data/test/tc_multiarray.rb +2 -2
- data/test/tc_sequence.rb +4 -1
- metadata +3 -3
data/Rakefile
CHANGED
data/lib/multiarray.rb
CHANGED
@@ -621,8 +621,8 @@ class Array
|
|
621
621
|
size2 = 0.5 * ( retVal.size + 2 )
|
622
622
|
nIntegral = erf( +size2, sigma ) - erf( -size2, sigma )
|
623
623
|
value = 0.5 * ( nIntegral - integral )
|
624
|
-
retVal.unshift
|
625
|
-
retVal.push
|
624
|
+
retVal.unshift value
|
625
|
+
retVal.push value
|
626
626
|
integral = nIntegral
|
627
627
|
end
|
628
628
|
# Normalise result.
|
@@ -653,8 +653,8 @@ class Array
|
|
653
653
|
size2 = 0.5 * ( retVal.size + 2 )
|
654
654
|
nIntegral = gauss( size2, sigma )
|
655
655
|
value = integral - nIntegral
|
656
|
-
retVal.unshift
|
657
|
-
retVal.push
|
656
|
+
retVal.unshift +value
|
657
|
+
retVal.push -value
|
658
658
|
sumX += value * ( retVal.size - 1 )
|
659
659
|
integral = nIntegral
|
660
660
|
end
|
@@ -84,7 +84,7 @@ module Hornetseye
|
|
84
84
|
@dest
|
85
85
|
end
|
86
86
|
|
87
|
-
# Recursive function to perform connected component
|
87
|
+
# Recursive function to perform connected component labeling
|
88
88
|
#
|
89
89
|
# @param [Array<Proc>] args Array with functions for locating neighbouring elements.
|
90
90
|
# @param [Array<Proc>] comp Array with functions for locating neighbouring labels.
|
data/lib/multiarray/diagonal.rb
CHANGED
@@ -105,7 +105,7 @@ module Hornetseye
|
|
105
105
|
end
|
106
106
|
j0.upto( ( @index2.size - 1 ).minor( @index0 + s1 ) ) do |j|
|
107
107
|
i = @index0.get + s1.get - j
|
108
|
-
sub = @value.subst @index1 => INT.new( i ), @index2 => INT.new( j )
|
108
|
+
sub = @value.subst @index1 => INT.new( i ), @index2 => INT.new( j )
|
109
109
|
retval.assign @block.subst( @var1 => retval, @var2 => sub )
|
110
110
|
end
|
111
111
|
retval
|
data/lib/multiarray/gccvalue.rb
CHANGED
@@ -279,6 +279,15 @@ module Hornetseye
|
|
279
279
|
0
|
280
280
|
end
|
281
281
|
|
282
|
+
def fmod( other )
|
283
|
+
if GCCValue.generic? other
|
284
|
+
GCCValue.new @function, "fmod( #{self}, #{other} )"
|
285
|
+
else
|
286
|
+
x, y = other.coerce self
|
287
|
+
x.send op, y
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
282
291
|
# Create code for conditional selection of value
|
283
292
|
#
|
284
293
|
# @param [GCCValue,Object] a First value.
|
@@ -87,6 +87,7 @@ module Hornetseye
|
|
87
87
|
define_binary_op :**, :coercion_maxint
|
88
88
|
define_binary_op :/
|
89
89
|
define_binary_op :%
|
90
|
+
define_binary_op :fmod
|
90
91
|
define_binary_op :and, :coercion_bool
|
91
92
|
define_binary_op :or, :coercion_bool
|
92
93
|
define_binary_op :&
|
@@ -113,6 +114,25 @@ module Hornetseye
|
|
113
114
|
self
|
114
115
|
end
|
115
116
|
|
117
|
+
# Modulo operation for floating point numbers
|
118
|
+
#
|
119
|
+
# This operation takes account of the problem that '%' does not work with
|
120
|
+
# floating-point numbers in C.
|
121
|
+
#
|
122
|
+
# @return [Node] Array with result of operation.
|
123
|
+
def fmod_with_float( other )
|
124
|
+
unless other.is_a? Node
|
125
|
+
other = Node.match( other, typecode ).new other
|
126
|
+
end
|
127
|
+
if typecode < FLOAT_ or other.typecode < FLOAT_
|
128
|
+
fmod other
|
129
|
+
else
|
130
|
+
fmod_without_float other
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
alias_method_chain :%, :float, :fmod
|
135
|
+
|
116
136
|
# Convert array elements to different element type
|
117
137
|
#
|
118
138
|
# @param [Class] dest Element type to convert to.
|
@@ -517,18 +537,19 @@ module Hornetseye
|
|
517
537
|
end
|
518
538
|
end
|
519
539
|
|
520
|
-
# Compute
|
540
|
+
# Compute table from two arrays
|
521
541
|
#
|
522
|
-
# Used internally to implement convolutions.
|
542
|
+
# Used internally to implement convolutions and other operations.
|
523
543
|
#
|
524
|
-
# @param [Node] filter Filter to form
|
544
|
+
# @param [Node] filter Filter to form table with.
|
545
|
+
# @param [Proc] action Operation to make table for.
|
525
546
|
#
|
526
547
|
# @return [Node] Result of operation.
|
527
548
|
#
|
528
549
|
# @see #convolve
|
529
550
|
#
|
530
551
|
# @private
|
531
|
-
def
|
552
|
+
def table( filter, &action )
|
532
553
|
filter = Node.match( filter, typecode ).new filter unless filter.is_a? Node
|
533
554
|
if filter.dimension > dimension
|
534
555
|
raise "Filter has #{filter.dimension} dimension(s) but should " +
|
@@ -536,9 +557,9 @@ module Hornetseye
|
|
536
557
|
end
|
537
558
|
filter = Hornetseye::lazy( 1 ) { filter } while filter.dimension < dimension
|
538
559
|
if filter.dimension == 0
|
539
|
-
self
|
560
|
+
action.call self, filter
|
540
561
|
else
|
541
|
-
Hornetseye::lazy { |i,j| self[j].
|
562
|
+
Hornetseye::lazy { |i,j| self[j].table filter[i], &action }
|
542
563
|
end
|
543
564
|
end
|
544
565
|
|
@@ -551,27 +572,7 @@ module Hornetseye
|
|
551
572
|
filter = Node.match( filter, typecode ).new filter unless filter.is_a? Node
|
552
573
|
array = self
|
553
574
|
( dimension - filter.dimension ).times { array = array.roll }
|
554
|
-
array.
|
555
|
-
end
|
556
|
-
|
557
|
-
# Create spread array similar to product array
|
558
|
-
#
|
559
|
-
# Used internally to implement erosion and dilation.
|
560
|
-
#
|
561
|
-
# @param [Integer] n Size of spread.
|
562
|
-
#
|
563
|
-
# @return [Node] Result of operation.
|
564
|
-
#
|
565
|
-
# @see #erode
|
566
|
-
# @see #dilate
|
567
|
-
#
|
568
|
-
# @private
|
569
|
-
def spread( n = 3 )
|
570
|
-
if dimension > 0
|
571
|
-
Hornetseye::lazy( n, shape.last ) { |i,j| self[j].spread n }
|
572
|
-
else
|
573
|
-
self
|
574
|
-
end
|
575
|
+
array.table( filter ) { |a,b| a* b }.diagonal { |s,x| s + x }
|
575
576
|
end
|
576
577
|
|
577
578
|
# Erosion
|
@@ -582,7 +583,8 @@ module Hornetseye
|
|
582
583
|
#
|
583
584
|
# @return [Node] Result of operation.
|
584
585
|
def erode( n = 3 )
|
585
|
-
|
586
|
+
filter = Hornetseye::lazy( *( [ n ] * dimension ) ) { 0 }
|
587
|
+
table( filter ) { |a,b| a }.diagonal { |m,x| m.minor x }
|
586
588
|
end
|
587
589
|
|
588
590
|
# Dilation
|
@@ -593,7 +595,8 @@ module Hornetseye
|
|
593
595
|
#
|
594
596
|
# @return [Node] Result of operation.
|
595
597
|
def dilate( n = 3 )
|
596
|
-
|
598
|
+
filter = Hornetseye::lazy( *( [ n ] * dimension ) ) { 0 }
|
599
|
+
table( filter ) { |a,b| a }.diagonal { |m,x| m.major x }
|
597
600
|
end
|
598
601
|
|
599
602
|
# Sobel operator
|
@@ -603,7 +606,7 @@ module Hornetseye
|
|
603
606
|
# @return [Node] Result of Sobel operator.
|
604
607
|
def sobel( direction )
|
605
608
|
( dimension - 1 ).downto( 0 ).inject self do |retval,i|
|
606
|
-
filter = i == direction ? Hornetseye::Sequence( SINT, 3 )[
|
609
|
+
filter = i == direction ? Hornetseye::Sequence( SINT, 3 )[ 1, 0, -1 ] :
|
607
610
|
Hornetseye::Sequence( SINT, 3 )[ 1, 2, 1 ]
|
608
611
|
Hornetseye::lazy { retval.convolve filter }
|
609
612
|
end.force
|
@@ -725,7 +728,7 @@ module Hornetseye
|
|
725
728
|
left
|
726
729
|
end
|
727
730
|
|
728
|
-
# Perform connected component
|
731
|
+
# Perform connected component labeling
|
729
732
|
#
|
730
733
|
# @option options [Object] :default (typecode.default) Value of background elements.
|
731
734
|
# @option options [Class] :target (UINT) Typecode of labels.
|
data/test/tc_multiarray.rb
CHANGED
@@ -450,9 +450,9 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
450
450
|
|
451
451
|
def test_sobel
|
452
452
|
m = M[ [ 0, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 0, 0 ] ]
|
453
|
-
assert_equal [ [
|
453
|
+
assert_equal [ [ 1, 0, -1, 0 ], [ 2, 0, -2, 0 ], [ 1, 0, -1, 0 ] ],
|
454
454
|
m.sobel( 0 ).to_a
|
455
|
-
assert_equal [ [
|
455
|
+
assert_equal [ [ 1, 2, 1, 0 ], [ 0, 0, 0, 0 ], [ -1, -2, -1, 0 ] ],
|
456
456
|
m.sobel( 1 ).to_a
|
457
457
|
end
|
458
458
|
|
data/test/tc_sequence.rb
CHANGED
@@ -393,7 +393,7 @@ class TC_Sequence < Test::Unit::TestCase
|
|
393
393
|
end
|
394
394
|
|
395
395
|
def test_sobel
|
396
|
-
assert_equal [ 0,
|
396
|
+
assert_equal [ 0, 1, 0, -1, 0 ], S[ 0, 0, 1, 0, 0 ].sobel( 0 ).to_a
|
397
397
|
end
|
398
398
|
|
399
399
|
def test_histogram
|
@@ -621,6 +621,9 @@ class TC_Sequence < Test::Unit::TestCase
|
|
621
621
|
|
622
622
|
def test_mod
|
623
623
|
assert_equal S[ 2, 0, 1 ], S[ 2, 3, 4 ] % 3
|
624
|
+
assert_equal S[ 1, 0, 3 ], 3 % S[ 2, 3, 4 ]
|
625
|
+
assert_equal S[ 2, 0.5, 1.5 ], S[ 2, 3, 4 ] % 2.5
|
626
|
+
assert_equal S[ 0.5, 2.5, 2.5 ], 2.5 % S[ 2, 3, 4 ]
|
624
627
|
end
|
625
628
|
|
626
629
|
def test_pow
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 22
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.22.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jan Wedekind
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-04-12 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|