本征:如何用 1 和 0 代替矩阵正值?
Eigen: how can I substitute matrix positive values with 1 and 0 otherwise?
我想在Eigen
中编写如下matlab代码(其中K
是pxp
,W
是pxb
):
H = (K*W)>0;
然而,到目前为止我唯一想到的是:
H = ((K*W.array() > 0).select(1,0));
此代码无法像 here 所解释的那样工作,但是将 0
替换为 VectorXd::Constant(p,0)
(如 link 问题中所建议的那样)会产生运行时错误:
Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int; int Value = 1]: Assertion `v == T(Value)' failed.
我该如何解决这个问题?
您不需要 .select()
。您只需要将 bool
的数组转换为 H
的组件类型的数组。
H = ((K * W).array() > 0.0).cast<double>();
您最初的尝试失败了,因为您的常量 1/0 数组的大小与 H
的大小不匹配。当 H
为 MatrixXd
时,使用 VectorXd::Constant
不是一个好的选择。你也有括号的问题。我想你想要 *
而不是 matlab 符号中的 .*
。
#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;
int main() {
const int p = 5;
const int b = 10;
MatrixXd H(p, b), K(p, p), W(p, b);
K.setRandom();
W.setRandom();
H = ((K * W).array() > 0.0).cast<double>();
std::cout << H << std::endl << std::endl;
H = ((K * W).array() > 0).select(MatrixXd::Constant(p, b, 1),
MatrixXd::Constant(p, b, 0));
std::cout << H << std::endl;
return 0;
}
在模板中调用模板成员函数时,需要使用template
关键字。
#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;
template<typename Mat, typename Vec>
void createHashTable(const Mat &K, Eigen::MatrixXi &H, Mat &W, int b) {
Mat CK = K;
H = ((CK * W).array() > 0.0).template cast<int>();
}
int main() {
const int p = 5;
const int b = 10;
Eigen::MatrixXi H(p, b);
Eigen::MatrixXf W(p, b), K(p, p);
K.setRandom();
W.setRandom();
createHashTable<Eigen::MatrixXf, Eigen::VectorXf>(K, H, W, b);
std::cout << H << std::endl;
return 0;
}
查看此内容以获得一些解释。
我想在Eigen
中编写如下matlab代码(其中K
是pxp
,W
是pxb
):
H = (K*W)>0;
然而,到目前为止我唯一想到的是:
H = ((K*W.array() > 0).select(1,0));
此代码无法像 here 所解释的那样工作,但是将 0
替换为 VectorXd::Constant(p,0)
(如 link 问题中所建议的那样)会产生运行时错误:
Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int; int Value = 1]: Assertion `v == T(Value)' failed.
我该如何解决这个问题?
您不需要 .select()
。您只需要将 bool
的数组转换为 H
的组件类型的数组。
H = ((K * W).array() > 0.0).cast<double>();
您最初的尝试失败了,因为您的常量 1/0 数组的大小与 H
的大小不匹配。当 H
为 MatrixXd
时,使用 VectorXd::Constant
不是一个好的选择。你也有括号的问题。我想你想要 *
而不是 matlab 符号中的 .*
。
#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;
int main() {
const int p = 5;
const int b = 10;
MatrixXd H(p, b), K(p, p), W(p, b);
K.setRandom();
W.setRandom();
H = ((K * W).array() > 0.0).cast<double>();
std::cout << H << std::endl << std::endl;
H = ((K * W).array() > 0).select(MatrixXd::Constant(p, b, 1),
MatrixXd::Constant(p, b, 0));
std::cout << H << std::endl;
return 0;
}
在模板中调用模板成员函数时,需要使用template
关键字。
#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;
template<typename Mat, typename Vec>
void createHashTable(const Mat &K, Eigen::MatrixXi &H, Mat &W, int b) {
Mat CK = K;
H = ((CK * W).array() > 0.0).template cast<int>();
}
int main() {
const int p = 5;
const int b = 10;
Eigen::MatrixXi H(p, b);
Eigen::MatrixXf W(p, b), K(p, p);
K.setRandom();
W.setRandom();
createHashTable<Eigen::MatrixXf, Eigen::VectorXf>(K, H, W, b);
std::cout << H << std::endl;
return 0;
}
查看此内容以获得一些解释。