0

我有一个矩阵A(尺寸为mxn)和向量b(尺寸为nx1)。

我想构造一个向量_repmat_((A*b),[C 1]),其中C = n/m。我正在使用大量数据,因此n~100000和 C~10。

如您所见,这实际上是块矩阵乘法,无需显式创建完整 的 A块矩阵(维度nxn),因为这很容易超出可用内存。

A是稀疏的,并且已经使用函数 进行了转换_sparse()_

  1. 有没有更好的方法来做到这一点?(考虑到速度和内存占用的权衡,我宁愿拥有更小的内存占用)
  2. 通常,如果我在进行元素计算,我会使用bsxfun而不是使用repmat来最小化内存占用。据我所知,矩阵乘法没有等效的 bsxfun 吗?
4

1 回答 1

0

看起来是时候让您真正学习使用稀疏矩阵了,而不是想知道如何做到这一点。

如果您正确创建它们,SPARSE 块对角矩阵不会占用大量内存。我将使用我的blktridiag函数,它实际上创建了块三对角矩阵。在这里,我用它来创建随机块对角矩阵。我已将非对角元素设置为零,因此它确实是块对角线。

A = rand(3,3,100000);
tic,M = blktridiag(A,zeros(3,3,99999),zeros(3,3,99999));toc
Elapsed time is 0.478068 seconds.

而且,虽然它不小,但所需的内存并不比存储对角线元素本身所需的内存多两倍。

whos A M
  Name           Size                     Bytes  Class     Attributes

  A              3x3x100000             7200000  double              
  M         300000x300000              16800008  double    sparse    

这里大约 17 兆字节,而 7 兆字节。

请注意,blktridiag直接显式创建稀疏矩阵。

于 2013-07-23T13:32:46.367 回答