Matlab:'阻止'矩阵乘法而不求助于repmat

时间:2013-07-23 13:02:04

标签: matlab matrix-multiplication

我有一个矩阵 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?

1 个答案:

答案 0 :(得分: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直接显式创建稀疏矩阵。