Как я могу векторизовать медленный код в MATLAB для увеличения производительности? - PullRequest
2 голосов
/ 09 ноября 2019

Как я могу векторизовать этот код? На данный момент он работает так медленно. Я действительно застрял и провел последние пару часов, пытаясь векторизовать его, однако я не могу заставить его работать правильно.

Моя наивная программа ниже работает невероятно медленно. N должно быть действительно 10000, но программа борется с N = 100. Любой совет будет принят во внимание.

Код хочет перебрать функции, данные N раз для каждого значения w21. Затем он строит последние 200 значений для каждого значения w21. Приведенный ниже код работает, как и ожидалось, с точки зрения графика, но, как уже упоминалось, далеко не медленный, поскольку для хорошего графика значения должны быть в тысячах.

hold on
% Number of iterations
N = 100;
x = 1; 
y = 1;
z = 1;

for w21 = linspace(-12,-3,N)
    for i = 1:N-1
        y = y_iterate(x,z,w21);
        z = z_iterate(y);
        x = x_iterate(y);
        if i >= (N - 200)
            p = plot(w21,x,'.k','MarkerSize',3);  
        end
    end
end

Обязательные функции:

function val = x_iterate(y)
    val = -3 + 8.*(1 ./ (1 + exp(-y))); 
end
function val = z_iterate(y)
    val = -7 + 8.*(1 ./ (1 + exp(-y)));
end
function val = y_iterate(x,z,w21)
    val = 4 + w21.*(1 ./ (1 + exp(-x))) + 6.*(1 ./ (1 + exp(-z)));
end

1 Ответ

4 голосов
/ 10 ноября 2019

Я верю, что это из-за plot. Попробуйте:

[X,Y,Z] = deal( zeros(N,N-1) );
w21 = linspace(-12,-3,N);
for i = 1:N
    for j = 1:N-1
        y = y_iterate(x,z,w21(i));
        z = z_iterate(y);
        x = x_iterate(y);
        X(i,j) = x;
        Y(i,j) = y;
        Z(i,j) = z;
    end
end
nn = max(1,N-200);
plot(w21,X(nn:end,:),'.k')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...