1+ namespace MaxRev . Extensions . Binary
2+ {
3+ public static partial class BinaryRelations
4+ {
5+ #region Binary Operations
6+
7+ /// <summary>
8+ /// An intersection of two binary matrices
9+ /// </summary>
10+ /// <param name="matrix1">binary matrix</param>
11+ /// <param name="maxrix2">binary matrix</param>
12+ /// <returns>binary matrix</returns>
13+ public static bool [ , ] Intersection ( this bool [ , ] matrix1 , bool [ , ] maxrix2 )
14+ {
15+ ThrowIfNull_NotQuad_SizeDiffers ( matrix1 , maxrix2 ) ;
16+ var length = matrix1 . GetLength ( 0 ) ;
17+ var result = new bool [ length , length ] ;
18+
19+ for ( int i = 0 ; i < length ; i ++ )
20+ {
21+ for ( int j = 0 ; j < length ; j ++ )
22+ {
23+ // min of two cells
24+ result [ i , j ] = matrix1 [ i , j ] & maxrix2 [ i , j ] ;
25+ }
26+ }
27+
28+ return result ;
29+ }
30+
31+ /// <summary>
32+ /// Union of two binary matrices
33+ /// </summary>
34+ /// <param name="matrix1">binary matrix</param>
35+ /// <param name="maxrix2">binary matrix</param>
36+ /// <returns>binary matrix</returns>
37+ public static bool [ , ] Union ( this bool [ , ] matrix1 , bool [ , ] maxrix2 )
38+ {
39+ ThrowIfNull_NotQuad_SizeDiffers ( matrix1 , maxrix2 ) ;
40+
41+ var length = matrix1 . GetLength ( 0 ) ;
42+ var result = new bool [ length , length ] ;
43+
44+ for ( int i = 0 ; i < length ; i ++ )
45+ {
46+ for ( int j = 0 ; j < length ; j ++ )
47+ {
48+ // max of two cells
49+ result [ i , j ] = matrix1 [ i , j ] | maxrix2 [ i , j ] ;
50+ }
51+ }
52+
53+ return result ;
54+ }
55+
56+ /// <summary>
57+ /// Finds a difference between two binary matrices
58+ /// </summary>
59+ /// <param name="matrix1">binary matrix</param>
60+ /// <param name="maxrix2">binary matrix</param>
61+ /// <returns>binary matrix</returns>
62+ public static bool [ , ] Difference ( this bool [ , ] matrix1 , bool [ , ] maxrix2 )
63+ {
64+ ThrowIfNull_NotQuad_SizeDiffers ( matrix1 , maxrix2 ) ;
65+
66+ var length = matrix1 . GetLength ( 0 ) ;
67+ var result = new bool [ length , length ] ;
68+
69+ for ( int i = 0 ; i < length ; i ++ )
70+ {
71+ for ( int j = 0 ; j < length ; j ++ )
72+ {
73+ result [ i , j ] = matrix1 [ i , j ] && ! maxrix2 [ i , j ] ;
74+ }
75+ }
76+
77+ return result ;
78+ }
79+
80+ /// <summary>
81+ /// Returns a b-matrix of symmetric difference between two b-matrices
82+ /// </summary>
83+ /// <param name="matrix1">binary matrix</param>
84+ /// <param name="maxrix2">binary matrix</param>
85+ /// <returns>binary matrix</returns>
86+ public static bool [ , ] SymmetricDifference ( this bool [ , ] matrix1 , bool [ , ] maxrix2 )
87+ {
88+ ThrowIfNull_NotQuad_SizeDiffers ( matrix1 , maxrix2 ) ;
89+
90+ var length = matrix1 . GetLength ( 0 ) ;
91+ var result = new bool [ length , length ] ;
92+
93+ // next code is equal to a block below, but more efficient)
94+ // var m1 = matrix1.Difference(maxrix2);
95+ // var m2 = maxrix2.Difference(matrix1);
96+ // return m1.Union(m2);
97+ for ( int i = 0 ; i < length ; i ++ )
98+ {
99+ for ( int j = 0 ; j < length ; j ++ )
100+ {
101+ result [ i , j ] = maxrix2 [ i , j ] ^ matrix1 [ i , j ] ;
102+ }
103+ }
104+
105+ return result ;
106+ }
107+
108+ /// <summary>
109+ /// A product of two b-matrices
110+ /// </summary>
111+ /// <param name="matrix1">binary matrix</param>
112+ /// <param name="maxrix2">binary matrix</param>
113+ /// <returns>binary matrix</returns>
114+ public static bool [ , ] Product ( this bool [ , ] matrix1 , bool [ , ] maxrix2 )
115+ {
116+ ThrowIfNull_NotQuad_SizeDiffers ( matrix1 , maxrix2 ) ;
117+
118+ var length = matrix1 . GetLength ( 0 ) ;
119+ var result = new bool [ length , length ] ;
120+
121+ for ( int i = 0 ; i < length ; i ++ )
122+ {
123+ for ( int j = 0 ; j < length ; j ++ )
124+ {
125+ var max = false ;
126+
127+ for ( int k = 0 ; k < length ; k ++ )
128+ {
129+ max |= matrix1 [ i , k ] & maxrix2 [ k , j ] ;
130+ }
131+
132+ result [ i , j ] = max ;
133+ }
134+
135+ }
136+
137+ return result ;
138+ }
139+
140+ #endregion
141+ }
142+ }
0 commit comments