matlab – 当A是[3x3xN]时,是否有任何简短的方法来解决系统Ax = B,即多于一个矩阵?

我想尝试在没有循环的情况下实现它……

我有A,A [3x3xN]或[3,3,N],对于每个N,它是一个不同的矩阵.

和B作为[3x1xN]的当然……

如何在不循环的情况下解决它并且每次都做A ^ -1 * B?

最佳答案

Z = cellfun(@(a,b) a\b, ... %# Solve for each pair
            num2cell(A,[1 2]), ... %# Make a cell array containing each slice
            num2cell(B,[1 2]), ... %# Make a cell array containing each slice
            'UniformOutput',false);
Z = cat(3,Z{:}); %# Merge the results to a 3x1xN array

有关所用功能的更多详细信息,请参阅num2cellcellfun文档.

让我们将它的速度与for循环进行比较:

clc, clear

N = 100000;
D = 10;
A = rand(D,D,N);
B = rand(D,1,N);

tic
Z = cellfun(@(a,b) a\b, ...
            num2cell(A,[1 2]),num2cell(B,[1 2]),'UniformOutput',false);
Z = cat(3,Z{:});
toc

tic
Z2 = zeros(D,1,N);
for i = 1:N
    Z2(:,:,i) = A(:,:,i) \ B(:,:,i);
end
toc

all(isequal(Z,Z2))

我的结果如下:

Elapsed time is 2.130507 seconds.
Elapsed time is 1.306873 seconds.

我用不同的D值尝试了它,总是得到相似的比率.乔纳斯的赌注是正确的!

点赞