Eigen C++ライブラリ を使用して、各行列列に各ベクトル要素を乗算する必要があります。私は成功せずにcolwiseを試しました。
サンプルデータ:
Eigen::Matrix3Xf A(3,2); //3x2
A << 1 2,
2 2,
3 5;
Eigen::Vector3f V = Eigen::Vector3f(2, 3);
//Expected result
C = A.colwise()*V;
//C
//2 6,
//4 6,
//6 15
//this means C 1st col by V first element and C 2nd col by V 2nd element.
行列Aは3xNとVNx1を持つことができます。意味(列x行)。
これは私がすることです:
_Eigen::Matrix3Xf A(3, 2); // 3x2
A << 1, 2, 2, 2, 3, 5;
Eigen::Vector3f V = Eigen::Vector3f(1, 2, 3);
const Eigen::Matrix3Xf C = A.array().colwise() * V.array();
std::cout << C << std::endl;
_
出力例:
_ 1 2
4 4
9 15
_
あなたは近くにいました、トリックはブロードキャスト乗算を行うために.array()
を使用することです。
colwiseReturnType
には.array()
メソッドがないため、Aの配列ビューでcolwiseshenanigansを実行する必要があります。
2つのベクトルの要素ごとの積を計算したい場合(最もクールな猫はこれを アダマール積 と呼びます)、次のことができます。
_Eigen::Vector3f a = ...;
Eigen::Vector3f b = ...;
Eigen::Vector3f elementwise_product = a.array() * b.array();
_
これは、上記のコードが列ごとに行っていることです。
編集:
行のケースに対処するには、.rowwise()
を使用できます。また、適切にするために追加のtranspose()
が必要になります。
_Eigen::Matrix<float, 3, 2> A; // 3x2
A << 1, 2, 2, 2, 3, 5;
Eigen::Vector2f V = Eigen::Vector2f(2, 3);
// Expected result
Eigen::Matrix<float, 3, 2> C = A.array().rowwise() * V.transpose().array();
std::cout << C << std::endl;
_
出力例:
_ 2 6
4 6
6 15
_
つまり、各列を異なる係数でスケーリングする、つまり、不均一なスケーリングを適用する必要があります。スケーリングは、対角行列として最もよく表されます。したがって、次のようになります。
C = A * V.asDiagonal();
Eigenは式テンプレートに基づいているため、一時的なものは作成されず、Jacobの回答と同様のコードになります。
C = A.array().rowwise() * V.transpose().array();