我有一个像这样的大矩阵M
M=[A1, Z, Z, Z, Z, Z ;
Z, A2, Z, Z, Z, Z ;
Z, Z, A3, Z, Z, Z ;
Z, Z, Z, A4, Z, Z ;
Z, Z, Z, Z, A5, Z ;
Z, Z, Z, Z, Z, A6];
A1,A2,A3,A4,A5,A6
是4×4实对称矩阵,Z=zeros(4,4)
。
当矩阵M
中有数百万A
时,如何计算A1,A2,A3,..., An
的倒数?
我知道我可以将逆矩阵简化为
invM=[B1, Z, Z, Z, Z, Z
Z, B2, Z, Z, Z, Z
Z, Z, B3, Z, Z, Z
Z, Z, Z, B4, Z, Z
Z, Z, Z, Z, B5, Z
Z, Z, Z, Z, Z, B6];
B1,B2,B3,B4,B5,B6
是A1,A2,A3,A4,A5,A6
的逆矩阵。但是当有很多B
时,如何进行批处理?
提前谢谢。
答案 0 :(得分:1)
x(n) = inv(A(n))*b(n)
其中b
是等式Ax = b
中的解向量。
这就是为什么这很重要:
clc
N = 4; % Size of each A
m = 300; % Amount of matrices
% Create sparse, block diagonal matrix, and a solution vector
C = cellfun(@(~)rand(4), cell(m,1), 'UniformOutput', false);
A = sparse(blkdiag(C{:}));
b = randn(m*N,1);
% Block processing: use inv()
tic
for ii = 1:1e3
for jj = 1:m
inds = (1:4) + 4*(jj-1);
inv(A(inds,inds)) * b(inds); %#ok<MINV>
end
end
toc
% Block processing: use mldivide()
tic
for ii = 1:1e3
for jj = 1:m
inds = (1:4) + 4*(jj-1);
A(inds,inds) \ b(inds);
end
end
toc
% All in one go: use inv()
tic
for ii = 1:1e3
inv(A)*b;
end
toc
% All in one go: use mldivide()
tic
for ii = 1:1e3
A\b;
end
toc
结果:
Elapsed time is 4.740024 seconds. % Block processing, with inv()
Elapsed time is 3.587495 seconds. % Block processing, with mldivide()
Elapsed time is 69.482007 seconds. % All at once, with inv()
Elapsed time is 0.319414 seconds. % All at once, with mldivide()
现在,我的电脑与大多数电脑有点不同,所以你可能想重新做这个测试。但这些比率大致相同 - 计算明确的反转只需要比计算产品x = inv(A)*b
花费更多的时间。
如果在使用mldivide
时内存不足,则不应该遍历所有单个矩阵,而是将问题分成更大的块。像这样:
chunkSize = N*100;
x = zeros(size(A,1),1);
for ii = 1:N*m/chunkSize
inds = (1:chunkSize) + chunkSize*(ii-1);
x(inds) = A(inds,inds) \ b(inds);
end
答案 1 :(得分:0)
对角矩阵的倒数仅为B = 1 / A.
这里有证据:http://www.proofwiki.org/wiki/Inverse_of_Diagonal_Matrix