犰狳中的对角矩阵正确

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;

更容易使用