質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2400閲覧

[eigen]行列関連の足し算

antiquities_mas

総合スコア17

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/13 07:24

前提・実現したいこと

xT * A * x + B * x
(xTはxの転置を意味しています.)

のような二次関数を計算したいです.

A: 行列(Eigen::MatrixXd)
B: 横ベクトル(Eigen::RowVectorXd)
x: 縦ベクトル(Eigen::VectorXd)

発生している問題・エラーメッセージ

まず,数式通りに

cpp

1double sum; 2sum = xT * A * x + B * x;

としたのですが,

cannot convert ‘const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<double, double>, const Eigen::Product<Eigen::Product<Eigen::Matrix<double, 1, 2>, Eigen::Matrix<double, 2, 2>, 0>, Eigen::Matrix<double, 2, 1>, 0>, const Eigen::Product<Eigen::Matrix<double, 1, 2>, Eigen::Matrix<double, 2, 1>, 0> >’ to ‘double’ in assignment

というエラーが出ました.ここで,

cpp

1double sum; 2sum = xT * A * x; 3sum += B * x;

としたところ,エラーが消えました.

該当のソースコード

実際のコードも参考のため,載せておきます.

#include <iostream> #include <Eigen/Core> using namespace Eigen; using namespace std; int main() { Vector2d x(2); RowVector2d xT(2); x << 0, 1; xT = x.transpose(); Matrix2d A(2,2); A << 1.0, 1.0, 1.0, 2.0; RowVector2d B(2); B << -6.0, 4.0; double sum; sum = xT * A * x + B * x; /* sum = xT * A * x; sum += B * x; */ cout << sum << endl; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

1x1行列になる場合は明示的にdoubleにしてあげないとダメみたいですね。
ライブラリのバグか仕様だと思います。

sum = double(xT * A * x) + double(B * x);

投稿2020/10/18 03:31

maai

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問