(matlab) почему так долго считает???

vladan67

function s486
u(101,401)=0;
a(100)=0;
b(100)=0;
for I=1:101
u(I,1)=cos(2*pi*(I-1)/20);
end
for j=1:101
u(1,j+1)=2*u(2,j)-u(1,j);
u(2,j+1)=u(3,j)-2*u(2,j)+u(1,j)+u(2,j)+u(2,j);
alfa=0.38196601125011;
beta=u(1,j+1)-alfa*u(2,j+2);
a(1)=alfa;
b(1)=beta;
for I=1:100
a(I+1)=1/(3-a(I;
b(I+1)=(b(I)+u(I,j/(3-a(I;
end
u(101,j+1)=2*u(100,j)-u(101,j);
for I=100:-1:1
u(I,j+1)=a(I+1)*u(I+1,j+1)+b(I+1) ;
end
end
x = 0:100;
t = 0:100;
plot3(x,t,u(x,t;
end
вот эту прогу...

vladan67

епт.. уже долго считает...

vladan67

в приват тогда киньте плз..
зы еще считает..

vladan67

инициализация закончена! еще 10000 итераций!

lili197602

Похожая ситуация =)
Только сегодня решил, понимаешь, начать писать как следует на матлабе, так нет...
Вот этот вот кусок кода
nn=1;
for j=1:Nt+1
for n=1:Ny+1
for k=1:Nx+1
Ebin(k,n,j)=complex(re(nnim(nn;
nn=nn+1;
end
end
end

считается порядка 10 минут (Nx,Ny,Nt ~ 100)
Я в шоке. Может, конечно, надо поиграться с порядком следования циклов, но 10 минут - это слишком.

eduard615

hint:

>> v=[0:0.01:5];
>> tic;sin(v);toc
Elapsed time is 0.000098 seconds.
>> tic;for I=1:501 sin(v(I; end;toc
Elapsed time is 0.001379 seconds.
>>

lili197602

Хинт-то хинт, только не всегда к векторам свести получается =(
Это в матлабе нормальная практика, что циклы так долго обрабатываются?

eduard615

ну в целом да. циклы ы матлабе противоестественны. но на практике они не часто появляются. т.е. если вылез цикл, велика вероятность , что это ты чего-то не понимаешь

lili197602

Задача - заполнить трехмерный массив числами (типа функция 3-х переменных). Чего может быть проще, даже не знаю. =)
Всю идею своей тормознутостью убивает =)

eduard615

ну читать в хелпе главу Multidimensional Arrays до полного просветления

lili197602

ушел читать

stm7857777

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

lili197602

Прочитал хелп, ничего дельного по ускорению циклов не нашел.
Пробовал и заранее заводить массив и не заранее. Выигрыш мало заметен.
Пробовал менять порядок следования циклов и много что еще. Матлаб - тормоз в плане циклов - это мое нынешнее убеждение =)

Vladu

nn=1;
for j=1:Nt+1
for n=1:Ny+1
for k=1:Nx+1
Ebin(k,n,j)=complex(re(nnim(nn;
nn=nn+1;
end
end
end
Если im и re векторы, а не функции, попробуй,

Ebin = reshape(complex(re, im Nx+1, Ny+1, Nt+1)

maddok

Используйте Математику:

n=100;
Timing[
Array[a,{n,n,n}];
For[i=1,i<n,i++,
For[j=1,j<n,j++,
For[k=1,k<n,k++,
a[i,j,k]=Complex[i+j,k];
];
];
];
]
{10.594 Second,Null}

lili197602

2 : попробую.
2 : а математика умеет isosurface строить? =)

Vladu

 Ebin(k,n,j)=complex(re(nnim(nn;

a[i,j,k]=Complex[i+j,k];

{10.594 Second,Null}
Два обращения к массивам на сто тысяч элементов не считаются?
Оставить комментарий
Имя или ник:
Комментарий: