我试图在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
我想在不使用循环来加速计算的情况下这样做。
答案 0 :(得分: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,解决方案会变得有点棘手。
答案 1 :(得分: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 循环完全相同的结果,但要快得多。