Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在不同数组元素上工作的代码矢量化?_Matlab_Loops_Vectorization - Fatal编程技术网

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的大小相同) 整个程序大约需要

刚从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的大小相同)

整个程序大约需要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))