閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

また配列の要素同士の掛け算したいだけなのに行列計算させてしまった

OpenCVでMat同士の掛け算した結果が思ってたのと違ってちょっとハマった。

cv::Mat A = cv::Mat1f({2, 2}, {1, 2, 3, 4});
cv::Mat B = cv::Mat1f({2, 2}, {5, 6, 7, 8});

// [1, 2]   [5, 6]   [19, 22]
// [3, 4] x [7, 8] = [43, 50]
cv::Mat C = A * B;

// [1, 2]   [5, 6]   [ 5, 12]
// [3, 4] x [7, 8] = [21, 32]
cv::Mat D;
cv::multiply(A, B, D);

operator+はcv::addに対応してるのでoperator*もcv::multiplyとの対応を期待しちゃうじゃないですか。しませんか。普段行列使うかどうかで分かれそう。

見出しに「また」とあるように、過去にも似たようなやらかしをしたような気がするのだけど思い出せない。これ、いかにもPythonとかでやりそうだけど、Pythonだと行列の積は@演算子が用意されているので意図通りに動くんですよね。

import numpy as np

A = np.array([1, 2, 3, 4]).reshape((2, 2))
B = np.array([5, 6, 7, 8]).reshape((2, 2))

print(A @ B)
print(A * B)