因此,我试图用一个parfor调用这个函数(基本上是通过一个parfor循环中的向量用傅里叶级数进行曲线拟合):
function[coefnames,coef] = fourier_regression(vect_waves,n)
coef = zeros(length(vect_waves)-n,18);
current_coef = zeros(18,1); % All the terms of the fourier series
x = 1:n;
parpool_obj = parpool;
parfor i=n:length(vect_waves)
take_fourier = vect_waves(i-n+1:i);
f = fit(x,take_fourier,'fourier8');
current_coef = coeffvalues(f);
coef(i,1:length(current_coef)) = current_coef;
end
coefnames = coeffnames(f);
delete(parpool_obj);
end但我只是搞错了
不能对parfor中的变量coef进行分类。参见MATLAB中的并行循环,“概述”。
我似乎在任何地方都找不到解决办法,我不知道问题出在哪里。到底怎么回事?
发布于 2015-10-27 13:15:58
@Andras将其放在注释中,但这里的修复非常简单--您所需要做的就是为coef的第二个下标使用一种parfor允许的索引形式。在这种情况下,您需要:
parfor i = ...
coef(i, :) = ...;
end发布于 2015-10-27 11:50:41
在要填充的元素数量已知之前,您正在尝试填充数组。这意味着您的循环具有不同的current_coef长度,在运行循环之前无法确定它的长度。您需要在并行循环执行之前定义所有内容,因为执行顺序不是预先确定的。
解决这个问题的方法是@AndrasDeak在这篇文章的评论中给出的。(我不知道函数,或者它总是输出相同数量的元素,因此我只能解释为什么这段代码不能工作,而不是解决方案)
一般来说,最好先从速度上优化您的代码,然后尝试并行。即使没有退步。并行处理并不是一些神奇的东西,它希望你能通过草率的代码神奇地让它执行得更快,它是一个高度优化的工具,它在优化代码上工作得最好。
有关parfor的更好概述,请参见Saving time and memory using parfor in Matlab?
注意,您在今天的前一篇文章中称这段代码为“回归”,但事实并非如此。但是,如果是回归,parfor就不能工作了。
https://stackoverflow.com/questions/33367082
复制相似问题