4

ループなしで実装してみたい...

私はAを持っています。A[3x3xN]または[3,3、N]であり、Nごとに異なるマトリックスです。

そしてBはもちろん[3x1xN]として..

ループを実行せずにそれを解決し、毎回A ^ -1 * Bを作成するにはどうすればよいですか?

4

1 に答える 1

2
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

使用される機能の詳細については、ドキュメントを参照してnum2cellください。cellfun

その速度を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が、常に同じような比率になりました。ジョナスの賭けは正しいです!

于 2013-01-07T19:34:11.750 に答える