0

ループを使用せずに、Matlab ですべての 2x2 行列 A(i-1:1,j-1:j) を統合しようとしています。現在、私はループでやっていますが、非常に遅いです。コードを以下に示します。

A=rand(100)
t=linespace(0,1,100);
for i=2:length(A)
   for j=2:length(A)
       A_minor=A(i-1:i,j-1:j);
       B(i,j)=trapz(t(j-1:j),trapz(t(i-1:i),A_minor));
   end
end

計算を高速化するためにループを使用せずにこれを行いたいと思います。

4

2 に答える 2

1

Matlab Image Processing Toolbox をお持ちの場合は、blockprocを使用して必要なことを実行できる場合があります。

http://www.mathworks.com/help/images/ref/blockproc.html

blockproc を使用するには、行列の各位置で実行したいことを行う関数を定義する必要があります。trapz を使用している方法では、物事が少し複雑になることに注意してください (x 値を渡す - x 値がなくても済む場合は、コードを単純化できます)。ここでは、trapz を使用せずに実行し、結果をスケーリングします。

% Data
foo = rand(100);
t = linspace(0,1,100);

% Execute blockproc on the indexes
fooproc = blockproc(foo, [2, 2], @(x) trapz(trapz(x.data)));
fooproc = fooproc * (t(2)-t(1))^2; % re-scale by the square of the step size

x 値を trapz に渡す必要がある場合、解決策は少し複雑になります。

于 2013-08-22T18:57:51.697 に答える
0

trapz は単純な関数 (特に 2x2 行列上) であるため、関数を呼び出さずに結果を直接計算できます。

t = linspace(0,1,100); % Note that this is a step size of 0.010101
A = rand(100);
B = nan(size(A));

Atmp = (A(1:end-1,:) + A(2:end,:))/2;
Atmp = (Atmp(:,1:end-1) + Atmp(:,2:end))/2;

B(2:end,2:end) = Atmp * (t(2)-t(1))^2;

これにより、 forループとまったく同じ結果が得られますが、はるかに高速です。

于 2013-08-22T22:59:02.787 に答える