Matlab 在不同数组元素上工作的代码矢量化?
刚从matlab开始,矢量化, 有关问题: 怎么办:Matlab 在不同数组元素上工作的代码矢量化?,matlab,loops,vectorization,Matlab,Loops,Vectorization,刚从matlab开始,矢量化, 有关问题: 怎么办: %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 其中误差_km为:(n和t的大小相同) 整个程序大约需要
%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
其中误差_km为:(n和t的大小相同)
整个程序大约需要3到4分钟,对于小型测试用例,
我能够为循环创建并理解简单的矢量化备选方案,但我无法对该循环进行矢量化
有什么指导吗
更新:
在错误中,我现在使用:
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,Soln:
要摆脱主循环,只需在error\u km
中使用arrayfun,您不需要预先分配Nt
。这一步很重要。您可以在中了解更多有关为什么的信息
如果知道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
以下是您寻求的答案的一些部分,我相信您可以找到其余部分。可以替换表达式:
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))
k、n和t的初始尺寸是多少?此代码试图做什么?^查看编辑是否提供了更多信息,此代码基本上计算观察值和计算值中的错误,n(观察值)和t(时间)是从文件中读取的1D数组,两者大小相同。编辑:添加了更多代码,如果函数error\u km
不使用Nt,则可以不存储生成的Nt
的所有值,而使用Nt=…
代替Nt(i,1)。或者通过更改Nt=zeros()预先分配Nt
代码>到Nt=零(a,1)`。我现在还没有关于矢量化代码的答案。谢谢你的建议,但这只是一个代码片段,而不是整个代码;)但是我们仍然在使用循环,这是矢量化的方法吗?谢谢,但它不应该是:Nt(2:a,1)=(n(1:a-1),1^-1+k*(diff(t(:,1)))^-1?还返回v=sum((Nt(:,1)-n(2:a,1))。^2)@TarunG:你最初是在-1:2上写循环的,如果你想改变它,那就去吧。不,它是为了a(2:a)(不是吗??),不管怎样,我问了上面的问题,因为我猜diff会和升序索引一起工作,对吗?@TarunG:我被另一个答案弄糊涂了。你现在似乎很适合去。
Nt = zeros(size(n))