bitMatrix

概要
  bit 行列演算

Table 1. namespace sstd
プロトタイプ宣言動作説明
void copy(class sstd::bmat& lhs, class sstd::bmat& rhs);
void move(class sstd::bmat& lhs, class sstd::bmat& rhs);
void eye(class sstd::bmat& bMat);
void ones(class sstd::bmat& bMat);
void zeros(class sstd::bmat& bMat);
class sstd::bmat eye(const uint& row, const uint& col);
class sstd::bmat ones(const uint& row, const uint& col);
class sstd::bmat zeros(const uint& row, const uint& col);
class sstd::bmat eye(const uint& size);
class sstd::bmat ones(const uint& size);
class sstd::bmat zeros(const uint& size);
class sstd::bmat LxShiftMat(uint size, uint xShift);square matrix [size x size]
class sstd::bmat RxShiftMat(uint size, uint xShift);square matrix [size x size]
class sstd::bmat Tr(class sstd::bmat& rhs);lhs = Transpose(rhs)
void Tr_myself(class sstd::bmat& rhs);Transpose(rhs)
class sstd::bmat REShift(class sstd::bmat& rhs, uint ShiftNum);RightExpansionShift, 行列拡大右シフト
class sstd::bmat DEShift(class sstd::bmat& rhs, uint ShiftNum);DownExpansionShift, 行列拡大下シフト
void print(class sstd::bmat& mat);
void printn(class sstd::bmat& mat);
void printn_all(class sstd::bmat& mat);

Table 2. 演算子
演算子動作説明
=代入
+bit 和
*bit 積
^累乗
&bit and
|bit or
~bit 反転
+=
*=
^=
&=
|=
==等しい
!=等しくない
<<ビット行列の水平結合
&&ビット行列の垂直結合
[]要素アクセス (1値, 列優先) [i]
()要素アクセス (2値) (p, q)
使用例
#include <sstd/sstd.hpp>

int main(){
    // init test
    sstd::bmat bMat4x4(4, 4);
    sstd::eye(bMat4x4);   sstd::printn(bMat4x4);
    sstd::ones(bMat4x4);  sstd::printn(bMat4x4);
    sstd::zeros(bMat4x4); sstd::printn(bMat4x4);
    sstd::print(bMat4x4);     // for print debug
    sstd::print_all(bMat4x4); // for bmat debug // Internaly, the bit matrix is processed as a set of 8x8 matrices.

    sstd::bmat bonded8x8 = sstd::zeros(4, 4) << sstd::eye(4, 4) &&
                           sstd::ones(4, 4)  << sstd::eye(4, 4);
    sstd::printn(bonded8x8);
    
    sstd::bmat bMat8x9 = sstd::eye(8, 9);
    sstd::printn(bMat8x9);
    sstd::print_all(bMat8x9); // for debug // Internaly, the bit matrix is processed as a set of 8x8 matrices.

    sstd::printn(bMat8x9.rows());
    sstd::printn(bMat8x9.cols());
    printf("\n");

    // access to elements
    sstd::bmat M = sstd::zeros(4, 4);
    M(0, 1) = 1;
    M(1, 2) = 1;
    M(2, 3) = 1;
    M(3, 4) = 1;
    sstd::printn(M);
    sstd::printn(M*M); // multi

    // tranpose
    sstd:: bmat M_tr = M; // copy
    sstd::Tr_myself(M_tr);
    sstd::printn(M_tr);
    sstd::printn(sstd::Tr(M));

    // pow test
    sstd::bmat L1 = sstd::LxShiftMat(16, 1);
    sstd::printn(L1);
    sstd::bmat L7 = L1^((uint64)7); // この計算は後で確認して!!!
    sstd::printn(L7);

    uint N = 32;
    sstd::bmat I(N, N); sstd::eye(I);
    sstd::bmat L15 = sstd::LxShiftMat(N, 15);
    sstd::bmat R17 = sstd::RxShiftMat(N, 17);
    sstd::bmat L13 = sstd::LxShiftMat(N, 13);
    sstd::bmat T = (I + L15)*(I + R17)*(I + L13);
    sstd::printn(T);
    sstd::bmat Tp = T^(4294967296-1); // XORSHIFT
    sstd::printn(Tp);
    
    printf("Tp==I: "); if(Tp==I){ printf("true\n");  }else{ printf("false\n"); }
    printf("Tp!=I: "); if(Tp!=I){ printf("true\n");  }else{ printf("false\n"); }

    printf("I(0, 0): "); if(I(0, 0)){printf("true\n");}else{printf("false\n");}
    printf("I(1, 0): "); if(I(1, 0)){printf("true\n");}else{printf("false\n");}
    printf("I(0, 1): "); if(I(0, 1)){printf("true\n");}else{printf("false\n");}
    printf("I(1, 1): "); if(I(1, 1)){printf("true\n");}else{printf("false\n");}

    I = sstd::eye(4, 4);
    sstd::printn(I);
    I(0, 0) = false;
    I(1, 1) = false;
    I(0, 1) = 1;
    I(0, 2) = 1000; // "I(0, 2) = 1000;" に同じ.

//  I(1, 0) = I(2, 0) = I(2, 2);
    I(1, 0) = I(2, 0) = I(2, 2) = true;

    sstd::printn(I);

    sstd::printn(I);
    I[0] = false;
    I[1] = true;

    I[2] = I[3] = I[15];
    I[4] = I[5] = true;

    I[6] = I[7] = I(2, 2);
    I(2, 2) = I[0];

    sstd::printn(I);
}

実行結果
$ ./exe.exe
bMat4x4 =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

bMat4x4 =
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

bMat4x4 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

bonded8x8 =
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
1 1 1 1 1 0 0 0
1 1 1 1 0 1 0 0
1 1 1 1 0 0 1 0
1 1 1 1 0 0 0 1

bMat8x9 =
1 0 0 0 0 0 0 0   0
0 1 0 0 0 0 0 0   0
0 0 1 0 0 0 0 0   0
0 0 0 1 0 0 0 0   0
0 0 0 0 1 0 0 0   0
0 0 0 0 0 1 0 0   0
0 0 0 0 0 0 1 0   0
0 0 0 0 0 0 0 1   0

1 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1   0 0 0 0 0 0 0 0

bMat8x9.rows() = 8
bMat8x9.cols() = 9

M =
0 1 0 0
0 0 1 0
0 0 0 1
0 0 0 0

M*M =
0 0 1 0
0 0 0 1
0 0 0 0
0 0 0 0

M_tr =
0 0 0 0
1 0 0 0
0 1 0 0
0 0 1 0

sstd::Tr(M) =
0 0 0 0
1 0 0 0
0 1 0 0
0 0 1 0

L1 =
0 1 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0   0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0

L7 =
0 0 0 0 0 0 0 1   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0

T =
1 0 0 0 0 0 0 0   0 0 0 0 0 1 0 1   0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0   0 0 0 0 0 0 1 0   1 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0
1 0 1 0 0 0 0 0   0 0 0 0 0 1 0 1   0 1 0 0 0 0 0 0   0 0 0 0 0 0 1 0
0 1 0 1 0 0 0 0   0 0 0 0 0 0 1 0   1 0 1 0 0 0 0 0   0 0 0 0 0 0 0 1
0 0 1 0 1 0 0 0   0 0 0 0 0 0 0 1   0 1 0 1 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 0   0 0 0 0 0 0 0 0   1 0 1 0 1 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 1 0 1 0   0 0 0 0 0 0 0 0   0 1 0 1 0 1 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 1   0 0 0 0 0 0 0 0   0 0 1 0 1 0 1 0   0 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0   1 0 0 0 0 0 0 0   0 0 0 1 0 1 0 1   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1   0 1 0 0 0 0 0 0   0 0 0 0 1 0 1 0   1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   1 0 1 0 0 0 0 0   0 0 0 0 0 1 0 1   0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 1 0 1 0 0 0 0   0 0 0 0 0 0 1 0   1 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 1 0 1 0 0 0   0 0 0 0 0 0 0 1   0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 1 0 1 0 0   0 0 0 0 0 0 0 0   1 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 1 0 1 0   0 0 0 0 0 0 0 0   0 1 0 1 0 1 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 1 0 1   0 0 0 0 0 0 0 0   0 0 1 0 1 0 1 0

0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0   1 0 0 0 0 0 0 0   0 0 0 1 0 1 0 1
1 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0   0 1 0 0 0 0 0 0   0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0   0 0 0 0 0 0 1 0   0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 1   0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0   1 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0   0 1 0 0 0 1 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0   0 0 0 0 0 0 0 0   0 0 1 0 0 0 1 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0   0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 1   0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1   0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0   1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   1 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0   0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 1 0 0 0 0 0 0   0 0 0 0 0 0 1 0   0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 1   0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0   1 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0   0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0   0 0 0 0 0 0 0 0   0 0 1 0 0 0 1 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0   0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 1

Tp =
1 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0   1 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 1 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 1   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   1 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 1 0 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 1 0 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0   0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 1   0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 1

Tp==I: true
Tp!=I: false
I(0, 0): true
I(1, 0): false
I(0, 1): false
I(1, 1): true
I =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

I =
0 1 1 0
1 0 0 0
1 0 1 0
0 0 0 1

I =
0 1 1 0
1 0 0 0
1 0 1 0
0 0 0 1

I =
0 1 1 0
1 1 0 0
1 1 0 0
1 1 0 1
実装

0 件のコメント:

コメントを投稿