@@ -48,6 +48,23 @@ impl SparseVector {
48
48
}
49
49
}
50
50
51
+ /// Creates a sparse vector from coordinates.
52
+ pub fn from_coordinates < I : IntoIterator < Item = ( i32 , f32 ) > > (
53
+ iter : I ,
54
+ dim : usize ,
55
+ ) -> SparseVector {
56
+ let mut elements: Vec < ( i32 , f32 ) > = iter. into_iter ( ) . collect ( ) ;
57
+ elements. sort_by_key ( |v| v. 0 ) ;
58
+ let indices: Vec < i32 > = elements. iter ( ) . map ( |v| v. 0 ) . collect ( ) ;
59
+ let values: Vec < f32 > = elements. iter ( ) . map ( |v| v. 1 ) . collect ( ) ;
60
+
61
+ SparseVector {
62
+ dim,
63
+ indices,
64
+ values,
65
+ }
66
+ }
67
+
51
68
/// Returns the sparse vector as a `Vec<f32>`.
52
69
pub fn to_vec ( & self ) -> Vec < f32 > {
53
70
let mut vec = vec ! [ 0.0 ; self . dim] ;
@@ -91,13 +108,28 @@ impl SparseVector {
91
108
#[ cfg( test) ]
92
109
mod tests {
93
110
use crate :: SparseVector ;
111
+ use std:: collections:: HashMap ;
94
112
95
113
#[ test]
96
114
fn test_from_dense ( ) {
97
115
let vec = SparseVector :: from_dense ( & [ 1.0 , 0.0 , 2.0 , 0.0 , 3.0 , 0.0 ] ) ;
98
116
assert_eq ! ( vec![ 1.0 , 0.0 , 2.0 , 0.0 , 3.0 , 0.0 ] , vec. to_vec( ) ) ;
99
117
}
100
118
119
+ #[ test]
120
+ fn test_from_coo_map ( ) {
121
+ let elements = HashMap :: from ( [ ( 0 , 1.0 ) , ( 2 , 2.0 ) , ( 4 , 3.0 ) ] ) ;
122
+ let vec = SparseVector :: from_coordinates ( elements, 6 ) ;
123
+ assert_eq ! ( vec![ 1.0 , 0.0 , 2.0 , 0.0 , 3.0 , 0.0 ] , vec. to_vec( ) ) ;
124
+ }
125
+
126
+ #[ test]
127
+ fn test_from_coo_vec ( ) {
128
+ let elements = vec ! [ ( 0 , 1.0 ) , ( 2 , 2.0 ) , ( 4 , 3.0 ) ] ;
129
+ let vec = SparseVector :: from_coordinates ( elements, 6 ) ;
130
+ assert_eq ! ( vec![ 1.0 , 0.0 , 2.0 , 0.0 , 3.0 , 0.0 ] , vec. to_vec( ) ) ;
131
+ }
132
+
101
133
#[ test]
102
134
fn test_to_vec ( ) {
103
135
let vec = SparseVector :: new ( 6 , vec ! [ 0 , 2 , 4 ] , vec ! [ 1.0 , 2.0 , 3.0 ] ) ;
0 commit comments