犰狳中正确的对角矩阵

Posted

技术标签:

【中文标题】犰狳中正确的对角矩阵【英文标题】:Diagonal matrix properly in armadillo 【发布时间】:2019-10-15 07:20:20 【问题描述】:

我的代码有效,但我只是想知道是否有人知道如何做到这一点但正确使用 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;

【问题讨论】:

你应该描述你的代码应该做什么。现在,任何可以回答您问题的人都需要首先通过查看您提供的代码来了解问题是什么。 是的,我确实忘了说代码的目的是什么。对不起 【参考方案1】:

您似乎正在对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 更容易使用;

【讨论】:

非常感谢,没那么难找到了diagmat函数但不知道怎么用。

以上是关于犰狳中正确的对角矩阵的主要内容,如果未能解决你的问题,请参考以下文章

在犰狳矩阵中具有概率的矢量化 Rcpp rbinom

对于太大的矩阵,特征值分解失败,犰狳 eigs_sym()

使用pytorch计算分类模型的混淆矩阵

如何在正确视图中创建 pearson 相关矩阵

装配8086矩阵对角线数和

卡尔曼增益和误差协方差矩阵应该是对角线吗?