MATLAB не хватает памяти во время выполнения программы - PullRequest
0 голосов
/ 26 февраля 2010

Я успешно использую MATLAB для решения некоторых проектов Euler . Вчера я написал код для решения одной из этих проблем ( 14 ). Когда я пишу код, содержащий длинные циклы, я всегда проверяю код, выполняя его с короткими циклами. Если он работает нормально и делает то, что должен, я предполагаю, что это также будет иметь место, когда длина цикла больше.

Это предположение оказалось неверным. При выполнении приведенного ниже кода MATLAB не хватило памяти где-то около 75000-й итерации.

c=1;
e=1000000;

for s=c:e
    n=s;
    t=1;
    while n>1
        a(s,t)=n;
        if mod(n,2) == 0
            n=n/2;
        else
            n=3*n+1;
        end
        a(s,t+1)=n;
        t=t+1;

    end
end

Что я могу сделать, чтобы этого не случилось? Нужно ли очищать переменные или освобождать память где-нибудь в процессе? Поможет ли сохранение полученной матрицы a на жесткий диск?

Ответы [ 4 ]

1 голос
/ 26 февраля 2010

Вот решение, максимально приближенное к вашему коду (что очень близко, главное отличие в том, что вам нужна только 1D матрица):

c=1;
e=1000000;
a=zeros(e,1);
for s=c:e
    n=s;
    t=1;
    while n>1
        if mod(n,2) == 0
            n=n/2;
        else
            n=3*n+1;
        end
        t=t+1;

    end
    a(s)=t;
end
[f g]=max(a);

Это занимает несколько секунд (обратите внимание на предварительное распределение), и в результате g открывает дверь Эйлера 14.

1 голос
/ 26 февраля 2010

Проще говоря, недостаточно памяти для хранения матрицы a.

Почему вы делаете здесь двумерную матрицу? Вы храните информацию, которую можете вычислить так же быстро, как и ее поиск.

Здесь гораздо лучше запомнить.

РЕДАКТИРОВАТЬ: Снова глядя, вы даже не используете материал, который вы положили в эту матрицу! Почему вы пытаетесь создать его?

0 голосов
/ 26 февраля 2010

Код, по-видимому, хранит каждую последовательность в другой строке матрицы. Количество столбцов этой матрицы будет равно длине самой длинной найденной последовательности. Это означает, что последовательность из двух чисел будет дополнена кучей правых нулей.

Я уверен, вы видите, как это невероятно неэффективно. Это может быть целью упражнения, или это будет для вас в этой реализации.

Лучше сохранить переменную типа «Семя самого длинного найденного раствора», которая будет хранить семя для самого длинного раствора. Я также хотел бы сохранить «длину самого длинного найденного решения», чтобы сохранить длину. Если вы попробуете каждое новое начальное число, если оно получит заголовок самого длинного, обновите эти переменные.

Это сохранит в памяти только то, что вам нужно.

0 голосов
/ 26 февраля 2010

Краткий ответ: вместо этого используйте 2d разреженную матрицу.

Длинный ответ: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sparse.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...