在 Matlab 中无需循环即可积分矩阵次数

问题描述 投票:0回答:2

我试图在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

我想在不使用循环的情况下执行此操作来加速计算。

loops matlab matrix numerical-integration
2个回答
1
投票

如果您有 Matlab 图像处理工具箱,您也许可以使用 blockproc 来完成您想要的操作。

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

要使用 blockproc,您需要定义一个函数来执行您想要在矩阵中的每个位置执行的操作。请注意,您使用 trapz 的方式使事情变得有点棘手(传递 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,解决方案会变得有点棘手。


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 循环完全相同的结果,但速度更快。

© www.soinside.com 2019 - 2024. All rights reserved.