2014-01-28 2 views
0

У меня есть функция Matlab, в котором я использую parfor и это выглядит следующим образом:MATLAB ошибка parfor

sbestposition=zeros(8,38); 
sbestvalue=zeros(8,1); 

matlabpool open 8 
parfor i=1:8 
    [ sbestvalue(i) sbestposition(i,1:i+30)] = pso(lb, ub, s2, i+31, 30,1,2,2); 
end 
matlabpool close 

SizeOf sbestposition зависит от величины i и это (1,31)i=1, когда и (1,38) когда i=8; и я намерен сохранить их значения в одной переменной.

Функция работает, когда она [ sbestvalue(i) sbestposition(i,:)] = pso(lb, ub, s2, i+31, 30,1,2,2); Но когда я ее использую, функция не будет работать снова из-за ошибки несоответствия размеров.

Вместо этого здесь он дает ошибку

Переменная sbestposition в parfor не могут быть классифицированы

Как это преодолеть?

спасибо.

ответ

0

Вы меняете размер переменной внутри обтекателя .

+0

Я не вижу изменений в измерениях. – Daniel

+0

все переменные, которые будут изменены, должны быть определены внутри цикла. – NKN

+1

За исключением разрезанных переменных: http://www.mathworks.de/de/help/distcomp/advanced-topics.html#bq_tcng-1 – Daniel

1

Почему бы не использовать массив ячеек для sbestposition

parfor i = 1:8 
    [sbestvalue(i), sbestposition{i}] = ... 
end 
1

Matlab «не знает», как разрезать переменную в такой сложной схеме. Каждая итерация использует не более полной строки, а тем более - строки. Сделать это очевидно, что переменная должна быть нарезана ряд мудр:

parfor i=1:8 
    p=zeros(1,38); 
    [sbestvalue(i),p(1:i+30)]=pso(lb, ub, s2, i+31, 30,1,2,2); 
    sbestposition(i,:)=p; 
end 

В этом коде, набор инструментов может нажать каждую строку к одному работнику, не имея, очевидно, никакого вмешательства.

+1

Я согласен с ответом Даниила. – NKN

Смежные вопросы