@@ -201,14 +201,18 @@ fn most_popular_edge_color(num_colors: usize, png: &PngImage) -> usize {
201
201
}
202
202
203
203
// Calculate co-occurences matrix
204
- fn co_occurrence_matrix ( num_colors : usize , png : & PngImage ) -> Vec < Vec < usize > > {
205
- let mut matrix = vec ! [ vec![ 0 ; num_colors] ; num_colors] ;
204
+ fn co_occurrence_matrix ( num_colors : usize , png : & PngImage ) -> Vec < Vec < u32 > > {
205
+ let mut matrix = vec ! [ vec![ 0u32 ; num_colors] ; num_colors] ;
206
206
let mut prev: Option < ScanLine > = None ;
207
+ let mut prev_val = None ;
207
208
for line in png. scan_lines ( false ) {
208
209
for i in 0 ..line. data . len ( ) {
209
210
let val = line. data [ i] as usize ;
210
- if i > 0 {
211
- matrix[ line. data [ i - 1 ] as usize ] [ val] += 1 ;
211
+ if val > num_colors {
212
+ continue ;
213
+ }
214
+ if let Some ( prev_val) = prev_val. replace ( val) {
215
+ matrix[ prev_val] [ val] += 1 ;
212
216
}
213
217
if let Some ( prev) = & prev {
214
218
matrix[ prev. data [ i] as usize ] [ val] += 1 ;
@@ -220,7 +224,7 @@ fn co_occurrence_matrix(num_colors: usize, png: &PngImage) -> Vec<Vec<usize>> {
220
224
}
221
225
222
226
// Calculate edge list sorted by weight
223
- fn weighted_edges ( matrix : & [ Vec < usize > ] ) -> Vec < ( usize , usize ) > {
227
+ fn weighted_edges ( matrix : & [ Vec < u32 > ] ) -> Vec < ( usize , usize ) > {
224
228
let mut edges = Vec :: new ( ) ;
225
229
for i in 0 ..matrix. len ( ) {
226
230
for j in 0 ..i {
0 commit comments