سؤال

ولقد التعليمات البرمجية التالية التي أحتاج لتشغيل أكثر من مصفوفة مع أكثر من 20000 الصفوف. يستغرق عدة دقائق لتشغيل وتظهر datenum وظائف str2double أن يكون الاختناقات. لأنه لا يعتمد على حساب سابقاتها هل هناك طريقة للخروج من حلقة إلى أجزاء متعددة، ويكون لهم تنفيذ بالتوازي؟ أي نصيحة على تحسين هذا الرمز سيكون موضع تقدير.

for i=1:length(DJI)
DJI2(i,1)=datenum(char(DJI(i,2)),'yyyy-mm-dd');
for j=3:7
DJI2(i,j-1)=str2double(char(DJI(i,j)));
end
end
هل كانت مفيدة؟

المحلول

وهم. أنا أكثر من شخص MATLAB من أوكتاف ولكن ربما أستطيع أن أساعد (إذا كنت لا تزال تبحث عن حل)

وهذا يبدو وكأنه وأنا القراءة في واحد في ملف ولكن-I-الحاجة إلى افعل شيئا مختلفا، مما رأس أداة يوفر مشكلة (وإلا يمكن أن تحصل بعيدا مع dlmread التي يجب أن تكون سريعة جدا).

إذا كان لا بديل داخل أوكتاف أن تكون أسرع هناك، فما استقاموا لكم فاستقيموا حاول استخدام جافا (للسرعة بدلا من خيوط)؛ يمكنك استدعاء جافا من أوكتاف . (على الرغم من أنني لم أحاول ذلك في أوكتاف، فقط ما يعادل MATLAB)

ووتدعو إلى str2double تبدو مشبوهة بفظاعة. قد تكون قادرة على vectorize ذلك، على الرغم من أن اختبار سرعة سريع على جهتي يبدو لتأكيد أن هذا هو العمل البطيء، على الأقل من داخل أوكتاف:

octave-3.0.3.exe:15> s=sprintf('1 2\n3 4');
octave-3.0.3.exe:16> m=str2double(s)
m =

   1   2
   3   4


octave-3.0.3.exe:35> s=randn(5000,5);
octave-3.0.3.exe:36> z=num2str(s);
octave-3.0.3.exe:37> tic; s2=str2double(z); toc
Elapsed time is 18.9837 seconds.

نصائح أخرى

وأسرع شيء نفعله، إذا كانت البيانات في ملف نصي، هو استخدام textread.

function [DJI2] = InterpretFile(datafile)
    [txtdates, c2, c3, c4, c5, c6] = textread(datafile, '%* %s %f %f %f %f %f');
    dates = datenum(strvcat(txtdates),'yyyy-mm-dd');
    DJI2 = [dates c2 c3 c4 c5 c6];

وخط شكل في textread يقول لتخطي العمود الأول، نسخ العمود الثاني كسلسلة، وتفسير 3 من خلال الأعمدة 7TH كأرقام النقطة العائمة. هذا يفترض ملف البيانات الخاص بك يبدو شيء من هذا القبيل

skip 1990-01-01 1.234 2.345 3.456 4.012 5.345
skipme2 1990-01-02 1 2 3 4 5
junk 1990-01-03 1.9 2.1 3.2 4.3 5.4

وأيضا، str2num حوالي 3X أسرع من str2double (أعتقد لأنها لا تفعل الكثير من الخطأ فحص)، في حال كنت بحاجة إلى استخدام شيء أشبه تقنية الأصلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top