如何在 C++ 中用犰狳生成这个矩阵?
How to generate this matrix with armadillo in c++?
我想在 C++ 中使用犰狳生成一个行为类似于 "truth table" 的矩阵,例如:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
我正在考虑这种循环,但我对犰狳及其数据结构不是很实际。
imat A = zeros<imat>(8, 3);
/* fill each row */
for(int i=0; i < 8; i++)
{
A.row(i) = (i/(pow(2, i)))%2 * ones<ivec>(3).t(); //
}
cout << "A = \n" << A << endl;
有什么想法吗?
如果你需要大尺寸truth table矩阵(~2^30
x 30
)如你所说here ,从内存的角度来看,你应该实现一个函数来快速计算你想要的值而不是将它们存储在矩阵中。
这很容易使用 std::bitset
完成,如下所示。
请注意,N
必须在编译时在此方法中确定。
然后你可以通过 matrix<3>(i,j)
:
得到你的 A(i,j)
的值
#include <bitset>
template <std::size_t N>
std::size_t matrix(std::size_t i, std::size_t j)
{
return std::bitset<N>(i)[N-j-1];
}
我想在 C++ 中使用犰狳生成一个行为类似于 "truth table" 的矩阵,例如:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
我正在考虑这种循环,但我对犰狳及其数据结构不是很实际。
imat A = zeros<imat>(8, 3);
/* fill each row */
for(int i=0; i < 8; i++)
{
A.row(i) = (i/(pow(2, i)))%2 * ones<ivec>(3).t(); //
}
cout << "A = \n" << A << endl;
有什么想法吗?
如果你需要大尺寸truth table矩阵(~2^30
x 30
)如你所说here ,从内存的角度来看,你应该实现一个函数来快速计算你想要的值而不是将它们存储在矩阵中。
这很容易使用 std::bitset
完成,如下所示。
请注意,N
必须在编译时在此方法中确定。
然后你可以通过 matrix<3>(i,j)
:
A(i,j)
的值
#include <bitset>
template <std::size_t N>
std::size_t matrix(std::size_t i, std::size_t j)
{
return std::bitset<N>(i)[N-j-1];
}