MATLAB中非常大的矩阵的有效乘法

时间:2010-12-12 03:08:08

标签: algorithm matlab linear-algebra octave matrix-multiplication

我没有足够的内存来简单地创建对角线D-by-D矩阵,因为D很大。我不断收到“内存不足”错误。

我没有在第一次乘法中执行M x D x D操作,而是执行M x D操作,但我的代码仍然需要很长时间才能运行。

有人能找到更有效的方法来执行乘法A'*B*A吗?这是我到目前为止所做的尝试:

D=20000
M=25

A = floor(rand(D,M)*10);
B = floor(rand(1,D)*10);

for i=1:D
    for j=1:M
        result(i,j) = A(i,j) * B(1,j);
    end
end    

manual = result * A';
auto = A*diag(B)*A';
isequal(manual,auto)

alt text

3 个答案:

答案 0 :(得分:12)

应该解决您问题的一个选项是使用sparse matrices。这是一个例子:

D = 20000;
M = 25;
A = floor(rand(D,M).*10);    %# A D-by-M matrix
diagB = rand(1,D).*10;       %# Main diagonal of B
B = sparse(1:D,1:D,diagB);   %# A sparse D-by-D diagonal matrix
result = (A.'*B)*A;         %'# An M-by-M result

另一种选择是沿着B的主对角线复制D元素,使用函数REPMAT创建一个M-by-D矩阵,然后使用element-wise multiplication和{{} 1}}:

A.'

另一种选择是使用函数BSXFUN

B = repmat(diagB,M,1);   %# Replicate diagB to create an M-by-D matrix
result = (A.'.*B)*A;    %'# An M-by-M result

答案 1 :(得分:3)

也许我在这里有点脑筋,但是你不能把你的DxD矩阵变成DxM矩阵(你给出的M个副本)然后。*最后两个矩阵而不是乘以它们(然后,当然,通常将第一个乘以找到的产品数量)?

答案 2 :(得分:3)

  1. 你正在“内存不足”,因为MATLAB找不到足够大的内存块来容纳整个矩阵。有不同的技术可以避免in MATLAB documentation所述的错误。

  2. 在MATLAB中,您显然不需要在大多数情况下编写显式循环,因为您可以使用运算符*。如果使用显式循环完成矩阵乘法,则存在一种技术,这里是an example in C#。很好的想法如何(可能很大)矩阵可以分成更小的矩阵。要在MATLAB中包含这些较小的矩阵,您可以使用单元矩阵。更有可能的是,系统找到足够的RAM来容纳两个较小的子矩阵,然后得到大的矩阵。

相关问题