【问题标题】:Integrating matrix minors without a loop in Matlab在Matlab中积分没有循环的矩阵小数
【发布时间】:2023-03-26 20:56:01
【问题描述】:

我试图在不使用循环的情况下在 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

我想不使用循环来加速计算。

【问题讨论】:

    标签: matlab loops matrix integration


    【解决方案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,解决方案会有点棘手。

    【讨论】:

    • 您能进一步解释一下吗?
    • 您可以使用此函数对矩阵的每个块执行函数。您可以指定是否希望块重叠或不相交。因此,在您的情况下,您希望在矩阵的每个 2x2 块上执行一个函数。我将编辑我的答案以提供更多详细信息。
    • 您能否编辑代码以合并重叠块?我想不通。谢谢!
    • @BabakP - 嗯 - 我虽然 blockproc 做了重叠块,但是当我查看文档时,我似乎也找不到如何。 :P 看来我弄错了。我会用另一种方法添加另一个答案。
    【解决方案2】:

    由于 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 循环完全相同的结果,但要快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多