2010-02-26 5 views
0

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

Это предположение оказалось неправильным. Выполняя приведенный ниже код, 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 помощь на жестком диске?

+0

Просто используйте Python! –

+4

@ Хамиш: Есть ли у Python больше оперативной памяти? – Jonas

ответ

1

Вот решение, оставаясь как можно ближе к коду (что очень близко, основное отличие состоит в том, что вам нужно только 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 открывает дверь Euler 14.

+0

Ты мужчина Рамашаланка! Благодарю. – Pieter

1

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

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

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

EDIT: Глядя снова, вы даже не используете материал, который вы положили в эту матрицу! Почему вы пытаетесь его создать?

+0

Кроме того, если вы не выделяете 'a' заранее с помощью = zeros (...), он сохраняет изменение размера и перераспределение памяти. –

+0

Anon: Я не вставлял всю свою программу в вопрос, просто петли, которые, как я думаю, вызывают проблему с памятью. Federico: Я не могу предварительно выделить матрицу размером 1 миллион. – Pieter

+2

Если матрица слишком велика для предварительного размещения, она слишком велика для создания внутри цикла. – Jonas

-1

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

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

+0

Спасибо TiansHUo. Я посмотрю. – Pieter

+0

Хранение всех данных не требуется и является расточительным.Хранить это нужно, тогда разреженный был бы приличным способом сделать это. Клеточные массивы могут быть лучше, хотя, в зависимости от разреженности. – MatlabDoug

0

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

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

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

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

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