チャンネル数の異なるMat間の四則演算等

チャンネル数の異なるMat間では、そのままではサイズが等しくても演算できないのだけど、Mat::isContinuous() が真かつ演算対象が連続するチャンネルならば、チャンネル数を合わせて演算する方法がある。

// m3の1チャンネルにm1を足す
void func(Mat3f m3, Mat1f m1) {
    assert(m3.total() == m1.total());
    m3.reshape(1, m3.total()).col(0) += m1.reshape(1, m1.total());
}

仕掛けは、reshape で1チャンネル3列 total() 行の行列に読み替えて、col()でその1列目(もとのMatの1チャンネルの配列)を指す行列ヘッダを作ること。このままでは m1 とのサイズが合わないので、m1を列ベクトルにする。これで、式テンプレートも使える。
2チャンネル以上の演算をする場合は、前者のcolをcolRangeにし、後者のreshapeにてチャンネル数分の列を持つようにすることで可能。
手軽(?)に書けて便利だけど、多分ベクトル演算はできないかも。