【发布时间】:2015-11-05 13:44:32
【问题描述】:
我有一个巨大的 m*n 矩阵 A(其中行数 m 比列数 n 大得多),它作为 armadillo mat 类型存储在我的 c++ 程序中。现在我有一个向量w,我必须为它计算w=w-A*A^T*w,其中A^T 表示矩阵A 的转置。
由于矩阵 A 非常大并且消耗大量内存,通常使用犰狳w=w-A*A.t()*w 的快速方法不起作用,因为在这种情况下犰狳会消耗大量内存(参见github)。他们解决这个问题的方法是引入函数inplace_trans( A, method ),它可以使用“lowmem”方法,消耗更少的内存但需要更多的时间。
我现在的问题是,inplace_trans( A, method ) 是一个 void 函数,所以我必须先创建我的矩阵的副本,然后才能计算新的w:
mat Q = A;
inplace_trans(Q, 'lowmmem');
w=w-A*Q*w;
但这当然不是我们想要的结果,因为我需要一个完整的矩阵副本,而我一开始就想避免这种情况(RAM 问题!)。
那么,如何以高效(=快速且低内存要求)的方式对矩阵进行转置以计算新的w?
如果我像 in 那样明智地做到这一点
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;
我必须将矩阵转置两次,因为之后我需要将其恢复为原始状态。我不敢相信这应该是最快的方式,因为它需要大量操作,恕我直言。
【问题讨论】:
标签: c++ matrix transpose armadillo