我没有足够的内存来简单地创建对角线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)
答案 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)
你正在“内存不足”,因为MATLAB找不到足够大的内存块来容纳整个矩阵。有不同的技术可以避免in MATLAB documentation所述的错误。
在MATLAB中,您显然不需要在大多数情况下编写显式循环,因为您可以使用运算符*
。如果使用显式循环完成矩阵乘法,则存在一种技术,这里是an example in C#。很好的想法如何(可能很大)矩阵可以分成更小的矩阵。要在MATLAB中包含这些较小的矩阵,您可以使用单元矩阵。更有可能的是,系统找到足够的RAM来容纳两个较小的子矩阵,然后得到大的矩阵。