犰狳中的对角矩阵正确
Diagonal matrix properly in armadillo
我的代码有效,但我只是想看看是否有人知道如何做到这一点,但正确使用 Armadillo 库。
感谢您的宝贵时间:)
arma::mat W = arma::mat(4, 4, arma::fill::ones);
arma::mat D = arma::mat(4, 4, arma::fill::zeros);
for (size_t i = 0; i < W.n_rows; i++)
{
for (size_t j = 0; j < W.n_cols; j++)
{
D(i, i) += W(i, j);
}
}
std::cout<< "W = \n"<< W <<std::endl;
std::cout<< "D = \n"<< D <<std::endl;
您似乎在对 W
矩阵中每一行的元素求和并将结果放在 D
矩阵的对角线上。也就是说,您正在对“列”维度上的元素求和。这在犰狳中很容易做到,不需要任何手动循环。
犰狳有一个 sum
函数,有一些重载。其中一个重载接收第二个参数,您可以使用该参数指定要在哪个维度中执行求和。只需指定第二个维度(索引 1
)即可获得正确的结果。
但是,您从 arma::sum(W, 1)
得到的结果将是一个向量。这是有道理的,因为您要对矩阵的一个维度求和。只需将结果传递给 arma::diagmat
即可获得与原始代码相同的 D
矩阵。然后可以将您的代码替换为
arma::mat W = arma::mat(4, 4, arma::fill::ones);
arma::mat D = arma::mat(4, 4, arma::fill::zeros);
W.print("W");
arma::diagmat(arma::sum(W, 1)).print("D");
注意:我已经使用了.print
方法来打印矩阵,以防你不知道。它比使用 std::cout;
更容易使用
我的代码有效,但我只是想看看是否有人知道如何做到这一点,但正确使用 Armadillo 库。 感谢您的宝贵时间:)
arma::mat W = arma::mat(4, 4, arma::fill::ones);
arma::mat D = arma::mat(4, 4, arma::fill::zeros);
for (size_t i = 0; i < W.n_rows; i++)
{
for (size_t j = 0; j < W.n_cols; j++)
{
D(i, i) += W(i, j);
}
}
std::cout<< "W = \n"<< W <<std::endl;
std::cout<< "D = \n"<< D <<std::endl;
您似乎在对 W
矩阵中每一行的元素求和并将结果放在 D
矩阵的对角线上。也就是说,您正在对“列”维度上的元素求和。这在犰狳中很容易做到,不需要任何手动循环。
犰狳有一个 sum
函数,有一些重载。其中一个重载接收第二个参数,您可以使用该参数指定要在哪个维度中执行求和。只需指定第二个维度(索引 1
)即可获得正确的结果。
但是,您从 arma::sum(W, 1)
得到的结果将是一个向量。这是有道理的,因为您要对矩阵的一个维度求和。只需将结果传递给 arma::diagmat
即可获得与原始代码相同的 D
矩阵。然后可以将您的代码替换为
arma::mat W = arma::mat(4, 4, arma::fill::ones);
arma::mat D = arma::mat(4, 4, arma::fill::zeros);
W.print("W");
arma::diagmat(arma::sum(W, 1)).print("D");
注意:我已经使用了.print
方法来打印矩阵,以防你不知道。它比使用 std::cout;