12

我没有足够的内存来简单地创建一个对角 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)

替代文字

4

3 回答 3

12

应该解决您的问题的一种选择是使用稀疏矩阵。这是一个例子:

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

另一种选择是沿主对角线复制 D 元素以使用函数REPMATB创建 M×D 矩阵,然后使用逐元素乘法A.'

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

还有一个选择是使用函数BSXFUN

result = bsxfun(@times,A.',diagB)*A;  %'# An M-by-M result
于 2010-12-12T05:15:42.183 回答
3

也许我在这里有点笨拙,但是您不能将您的 DxD 矩阵转换为 DxM 矩阵(带有您给出的向量的 M 个副本)然后 .* 最后两个矩阵而不是将它们相乘(然后,当然,通常将第一个乘以找到的产品数量)?

于 2010-12-12T04:30:07.483 回答
3
  1. 您正在“内存不足”,因为 MATLAB 找不到足够大的内存来容纳整个矩阵。MATLAB 文档中描述了避免此错误的不同技术。

  2. 在 MATLAB 中,您显然不需要在大多数情况下编写显式循环,因为您可以使用 operator *。如果使用显式循环完成,则存在一种如何加速矩阵乘法的技术,这是C# 中的一个示例。它很好地了解如何将(可能很大的)矩阵拆分为更小的矩阵。要在 MATLAB 中包含这些较小的矩阵,您可以使用单元矩阵。系统更有可能找到足够的 RAM 来容纳两个较小的子矩阵,然后是生成的大矩阵。

于 2010-12-12T08:11:58.977 回答