刚开始使用 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