web-dev-qa-db-ja.com

Eigen C ++ライブラリを使用した各ベクトル要素による各行列列の乗算

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行)。

9
SergioABP

これは私がすることです:

コード

_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
_
19
Jacob Panikulam

つまり、各列を異なる係数でスケーリングする、つまり、不均一なスケーリングを適用する必要があります。スケーリングは、対角行列として最もよく表されます。したがって、次のようになります。

C = A * V.asDiagonal();

Eigenは式テンプレートに基づいているため、一時的なものは作成されず、Jacobの回答と同様のコードになります。

C = A.array().rowwise() * V.transpose().array();
8
ggael