Я борюсь с векторизации этого цикла парфоров. Я хочу полностью удалить цикл parfor из кода, поскольку он занимает много времени, чтобы выполнить, когда n велико. См. Код, вставленный ниже. Я буду признателен за любые советы/советы/помощь любому человеку на этом форуме, который может дать мне это. Спасибо заранее.Vectorize For-If-Elseif Loop
% Initialization and precomputations
% w is an n x 1 vector
% beta: any number larger than 0. Usually set to 1.
f = zeros(n,1);
x = w;
y = w;
rho = 1;
v = f – (rho*y);
rhow = rho*w;
n = length(w);
parfor i = 1 : n
if w(i) >= 0
if v(i) < -rhow(i) – beta – 1
x(i) = (-beta -1 -v(i))/rho;
elseif (-rhow(i) – beta – 1 <= v(i)) && (v(i) <= -rhow(i) + beta – 1)
x(i) = w(i);
elseif (-rhow(i) + beta – 1 < v(i)) && (v(i) < beta – 1)
x(i) = (beta – 1 -v(i))/rho;
elseif (beta – 1 <= v(i)) && (v(i) <= beta + 1)
x(i) = 0;
else
x(i) = (beta + 1 – v(i))/rho;
end
else
if v(i) < -beta -1
x(i) = (-beta -1 – v(i))/rho;
elseif (-beta – 1 <= v(i))&& (v(i) <= -beta + 1)
x(i) = 0;
elseif (-beta + 1 < v(i)) && (v(i) < -rhow(i) – beta + 1)
x(i) = (-beta + 1 – v(i))/rho;
elseif (-rhow(i) – beta + 1 <= v(i)) && (v(i) <= -rhow(i) + beta + 1)
x(i) = w(i);
else
x(i) = (beta + 1 – v(i))/rho;
end
end
end
ОБНОВЛЕНИЕ: Большое спасибо Hbderts за ваш ответ, это очень помогло мне. Это то, что я, наконец, придумал. Я все еще получаю что-то не так, потому что, когда я устанавливаю значения для переменных, я не получаю желаемого результата, как у меня с парфором. Можете ли вы помочь мне взглянуть на нее и сообщить мне, где я ошибался? Спасибо заранее.
cond1 = (w >= 0);
cond2 = (w >= 0) & (v < -rhow-beta-1);
x(cond2) = (-beta-1-v(cond2))/rho;
cond3 = (w>=0)&(-rhow - beta -1 <= v) & (v <= -rhow + beta - 1);
x(cond3) = w(cond3);
cond4 = (w>=0) & (-rhow +beta - 1 < v) & (v < beta - 1);
x(cond4) = (beta - 1 - v(cond4))/rho;
cond5 = (w>=0) & (beta - 1 <= v) & (v <= beta + 1);
x(cond5) = 0;
cond6 = (~cond2);
x(cond6) = (beta + 1 - v(cond6))/rho;
cond7 = ((~cond1) & v < -beta -1);
x(cond7) = (-beta -1 - v(cond7))/rho;
cond8 = ((~cond1) & (-beta - 1 <= v) & (v <= -beta + 1));
x(cond8) = 0;
cond9 = ((~cond1) & (-beta + 1 < v) & (v < -rhow - beta + 1));
x(cond9) = (-beta + 1 - v(cond9))/rho;
cond10 = ((~cond1) & (-rhow - beta + 1 <= v) & (v <= -rhow + beta + 1));
x(cond10) = w(cond10);
cond11 = (~cond1);
x(cond11) = (beta + 1 - v(cond11))/rho;
ПОЖАЛУЙСТА, INDENT ВАМ КОД! Вы можете сделать это легко в Matlab CTRL + A; CTRL + I. Людям просто нужно начать программирование на питоне, чтобы узнать .... –
@AnderBiguri Или начальная векторизация из набора, не нужно беспокоиться об отступлении;) – Divakar
@Divakar Действительно. Но этот пример кода требует отступа. Это мой криптонит, я очень нервничаю с неподдельным кодом. –