适用于不同数组元素的代码矢量化



刚开始使用 matlab,以及矢量化,FF问题:

怎么办:

%n,t are vectors(1D arrays) EDIT: these are column vectors.
k=9;
i=1;
kv = 0.6*k:0.2*k:1.4*k;
[zs,zb] = size(k);
error1 = zeros(zs,1);
for k2 = kv
error1(i,1) = error_km(n,t,kv(i));
i= i+1;
end

其中error_km是:(n 和 t 大小相同)

function [ returnV] = error_km( n,t,k )
returnV = 0
    [a,b] = size(n);
    Nt = zeros();
    for i=2:a
        Nt(i,1) = (n(i-1,1)^-1 + k*(t(i,1)-t(i-1,1)))^-1;
        error1 = Nt(i,1) - n(i,1);
        returnV = returnV + error1*error1;
    end

整个程序大约需要 3 到 4 分钟,对于小型测试用例,我能够制作和理解循环的简单矢量化替代方案,但我无法对这个循环进行矢量化

有什么指导吗?

更新:在error_km,现在我正在使用:

Nt = (n(1:a-1,1).^-1 + (diff(t(:,1))).*k).^-1 - n(2:a,1);
Nt = Nt.^2;
returnV = sum(Nt);

效果很好,但仍然在主程序中,如果我使用 kv(:),我被迫使用循环来迭代 kv它每次都传递向量来函数而不是单个值。在主:error1 = error_km(n,t,kv.*1);中使用了这个

是否也可以摆脱主循环?

编辑2, 索恩 :

要摆脱主循环,只需使用arrayfun

以下是您寻求的答案的某些部分,我相信您可以弄清楚其余部分。 您可以替换表达式:

t(i,1)-t(i-1,1)

使用(矢量化)表达式

diff(t(:,1))

然后,您可以将循环替换为表达式i

Nt(a:-1:2,1) = (n(a-1:-1:1),1)^-1 + k*(diff(t(:,1))))^-1;
returnV = dot(Nt(:,1)-n(:,1),Nt(:,1)-n(:,1));

如果我正确阅读了您的代码并正确匹配了括号,那么矢量化可能足以满足您的口味。

正如你已经被告知的那样,你应该预先分配Nt,在这种情况下,我会写:

Nt = zeros(size(n))

error_km中,您不会预先分配Nt。 此步骤很重要。 您可以在此 Matlab 帮助文件中了解有关原因的更多信息。

如果你知道Nt的大小,你可以在调用 zeros() 时设置它。 否则,您可以重构循环:

function [ returnV] = error_km( n,t,k )
returnV = 0
    [a,b] = size(n);
    Nt = zeros();
    for i=a:-1:2
        Nt(i,1) = (n(i-1,1)^-1 + k*(t(i,1)-t(i-1,1)))^-1;
        error1 = Nt(i,1) - n(i,1);
        returnV = returnV + error1*error1;
    end

最新更新