c++ - Armadillo 矩阵转置

标签 c++ matrix transpose armadillo

我有一个巨大的 m*n 矩阵 A(其中行数 m 远大于列数 n),它作为 armadillo mat 存储在我的 C++ 程序中 类型。现在我有一个 vector w,我必须为其计算 w=w-A*A^T*w 其中 A^T 表示转置矩阵 A.

由于矩阵 A 非常大并且消耗大量内存,通常使用 Armadillo w=w-A*A.t()*w 的快速方法不起作用,因为 Armadillo 消耗大量内存在这种情况下(参见 github )。他们解决这个问题的方法是引入函数 inplace_trans( A, method ),它可以使用消耗更少内存但需要更多时间的方法“lowmem”。

我现在的问题是,inplace_trans( A, method ) 是一个空函数,所以我必须先创建矩阵的拷贝,然后才能计算新的 w :

mat Q = A;
inplace_trans(Q, 'lowmmem');
w=w-A*Q*w;

但这当然不是想要的结果,因为我需要矩阵的完整拷贝,而我一开始就想避免这种情况(RAM 问题!)。 那么,我怎样才能以高效(=快速且低内存要求)的方式对我的矩阵进行转置以计算新的 w

如果我像在元素中那样明智地做到这一点

mat A(m,n); //huge matrix, initialized before
vec temp(m);
temp.fill(0.0);
for (unsigned long int ii=0; ii<m; ii++){

    for (unsigned long int ll=0; ll<m; ll++){
        temp(ii)+=dot(A.row(ii),A.row(ll))*w(ll);
    }
}
w=w-temp;

我必须对行数 m 进行两次迭代,这是非常昂贵的。

编辑: 到目前为止,最快的方法如下:

vec temp(m);
inplace_trans(A, "lowmem");
temp = A * w;
inplace_trans(A, "lowmem");
temp = A * temp;

我必须转置矩阵两次,因为之后我需要将它恢复到原来的状态。我不敢相信这应该是最快的方法,因为它需要很多操作,恕我直言。

最佳答案

在您的编辑中,您已经正确地暗示,从复杂性的角度来看,执行两个矩阵 vector 乘法当然比计算 A*A.t() 更可取。首先然后将结果应用于 w .但是,您的问题似乎是您必须将矩阵转置两次。

如果您之后不需要将矩阵恢复为未转置形式,则该问题的一个简单解决方案是转置整个方程: w = w - A A^T w <==> w^T = w^T - w^T A A^T .在这种情况下,您可以先申请 A然后 A.t() .如果你能以某种方式定义 w完全是一个行 vector ,这将简单地等于

vec temp = w * A;
inplace_trans(A, "lowmem");
temp = temp * A;
w -= temp;

从概念上讲,行 vector 和列 vector 之间的存储应该没有区别,元素在内存中应该都是连续的。您将不得不看一下 Armadillo 在行 vector 和列 vector 之间产生的显着差异,但是 afaik vector 只是一维设置为一的矩阵。无论如何,与矩阵级别相比,此类考虑在 vector 级别上的严格程度要低得多。

关于c++ - Armadillo 矩阵转置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33546186/

相关文章:

c++ - 如何在 Eclipse 中指定预处理器指令?

python - 哪个数字代表 shape 返回的元组中的行和列?

c# - 在xy平面动态建立矩阵

math - 带中心的旋转矩阵

google-sheets - Google 表格 - 将不规则的列数据分组转置为行

c++ - C++ 中的 While 循环结束,但不会继续执行剩余的语句

c++ - 跳出内部循环并不会终止循环

c++ - 如何解压魔兽数据

c - 分而治之矩阵的就地转置

python - 转置列表子集维度?