parfor 与 Matlab "the variable __ in a parfor cannot be classified"
parfor with Matlab "the variable __ in a parfor cannot be classified"
所以我尝试使用 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
但我刚收到错误
"The variable coef in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".
我似乎无法在任何地方找到解决方案,我不知道问题出在哪里。怎么回事?
您正在尝试填充一个数组在要填充的元素数量未知之前。这意味着你的循环有不同的长度current_coef
,在循环是运行之前无法确定。您需要在并行循环执行之前定义所有内容,因为执行顺序不是预先确定的。
@AndrasDeak 在此 post 的评论中给出了解决此问题的方法。 (我不知道这个函数,或者它总是输出相同数量的元素,因此我只能解释为什么这段代码不起作用,而不是解决方案)
一般来说,最好先在速度方面优化代码,然后尝试并行。甚至没有倒退。并行处理不是什么魔术,希望您挥手处理草率的代码以神奇地使其执行得更快,它是一种高度优化的工具,最适合优化代码。
更好地了解 parfor
see
注意 您今天在早期的 post 中将这段代码称为 "regression",但事实并非如此。但是,如果它是回归,parfor
将不起作用。
@Andras Deak 将此放在评论中,但这里的修复非常简单 - 您需要做的就是对 coef
的第二个下标使用一种索引形式,这是 [=12] 允许的=].在这种情况下,你需要做:
parfor i = ...
coef(i, :) = ...;
end
所以我尝试使用 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
但我刚收到错误
"The variable coef in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview".
我似乎无法在任何地方找到解决方案,我不知道问题出在哪里。怎么回事?
您正在尝试填充一个数组在要填充的元素数量未知之前。这意味着你的循环有不同的长度current_coef
,在循环是运行之前无法确定。您需要在并行循环执行之前定义所有内容,因为执行顺序不是预先确定的。
@AndrasDeak 在此 post 的评论中给出了解决此问题的方法。 (我不知道这个函数,或者它总是输出相同数量的元素,因此我只能解释为什么这段代码不起作用,而不是解决方案)
一般来说,最好先在速度方面优化代码,然后尝试并行。甚至没有倒退。并行处理不是什么魔术,希望您挥手处理草率的代码以神奇地使其执行得更快,它是一种高度优化的工具,最适合优化代码。
更好地了解 parfor
see
注意 您今天在早期的 post 中将这段代码称为 "regression",但事实并非如此。但是,如果它是回归,parfor
将不起作用。
@Andras Deak 将此放在评论中,但这里的修复非常简单 - 您需要做的就是对 coef
的第二个下标使用一种索引形式,这是 [=12] 允许的=].在这种情况下,你需要做:
parfor i = ...
coef(i, :) = ...;
end