انجمن سایت کلیدستان


رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
سایز ماتریس در متلب (خطای Out of memory)

سایز ماتریس در متلب (خطای Out of memory)

#1
سلام
ببخشید میتونم بپرسم که حداکثر سایزی که برای یه ماتریس توی متلب میشه تعریف کرد چقدره؟ من مجبورم توی برنامه ام ماتریس هایی با ابعاد خیلی بزرگ داشته باشم اما متلب خطا میگیره راه حلش چیه مثلا ماتریسم تعداد سطراش 10^18 است که خطا میده
خیلی ممنون میشم اگه جوابمو بدید
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#2
سلام.
بله متاسفانه چنین مشکلی وجود داره.
مثلا من در کامپیوتر خود، دستور متلب زیر رو اجرا کردم :

کد:
A=ones(10^5,10^5);

و پیام خطای زیر نمایش داده میشه :

کد:
??? Out of memory. Type HELP MEMORY for your options.

من قبلا با این مشکل برخورد کرده بودم، اون زمان جستجو کردم و تا اونجایی که یادم میاد، تنها راهش استفاده از یک کامپیوتر قوی تر می باشد (یا سیستم عاملی مناسبتر). البته فکر نمی کنم میزان تغییر، خیلی شگفت انگیز باشه.
نکته مهمتر اینکه خود متلب هم برای آدرس دهی، یک سری محدودیت ها را ایجاد می کند (یعنی حتی برای کامپیوترهای قوی تر هم ممکنه این مشکل رو داشته باشه)

برای اطلاعات بیشتر دستور زیر را در متلب اجرا کنید :

کد:
memory

و همچنین برای توضیحات بیشتر، این دستور رو اجرا کنید :

کد:
help memory

توصیه می کنم سعی کنید برنامه رو به گونه ای بنویسید که نیاز به چنین ماتریس های بزرگی نباشه. یا اگر مجبور هستید، اطلاعات ماتریس مورد نظر را در چند ماتریس کوچکتر ذخیره کنید.
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط نوترینو90

سایز ماتریس در متلب (خطای Out of memory)

#3
با سلام مجدد
ممنون از پاسخ و توجه تون.
پایدار باشید
پاسخ
 سپاس شده توسط admin

سایز ماتریس در متلب (خطای Out of memory)

#4
(۱۳۹۲/۰۴/۲۴, ۱۰:۵۲ ب.ظ)'admin' نوشته: سلام.
بله متاسفانه چنین مشکلی وجود داره.
مثلا من در کامپیوتر خود، دستور متلب زیر رو اجرا کردم :


کد:
A=ones(10^5,10^5);

و پیام خطای زیر نمایش داده میشه :


کد:
??? Out of memory. Type HELP MEMORY for your options.

من قبلا با این مشکل برخورد کرده بودم، اون زمان جستجو کردم و تا اونجایی که یادم میاد، تنها راهش استفاده از یک کامپیوتر قوی تر می باشد (یا سیستم عاملی مناسبتر). البته فکر نمی کنم میزان تغییر، خیلی شگفت انگیز باشه.
نکته مهمتر اینکه خود متلب هم برای آدرس دهی، یک سری محدودیت ها را ایجاد می کند (یعنی حتی برای کامپیوترهای قوی تر هم ممکنه این مشکل رو داشته باشه)

برای اطلاعات بیشتر دستور زیر را در متلب اجرا کنید :


کد:
memory

و همچنین برای توضیحات بیشتر، این دستور رو اجرا کنید :


کد:
help memory

توصیه می کنم سعی کنید برنامه رو به گونه ای بنویسید که نیاز به چنین ماتریس های بزرگی نباشه. یا اگر مجبور هستید، اطلاعات ماتریس مورد نظر را در چند ماتریس کوچکتر ذخیره کنید.

 



من الان ماتریسی دارم که ستونش 9000 هست ، اما سطرش در هرمرحله داره زیاد میشه( با vertcat کردنش به ماتریس دیگری) .. به همین خاطر ارور out of memory در مثلا لوپ 150 داده میشه ..(تا آخر لوپ ها ، هم فکر میکنم تعداد سطر این ماتریس از 1 میلیون هم رد میشه!!!!! )
از اسپارس استفادهکردم بی فایده بود ، از Int8 استفاده کردم بازم هنگ و ....... هرکاری میکنم نمیشه ! رم من 6 گیگ هست.
باید چیکار کنم ؟؟؟ خیلی مهم هست این موضوع ! اینکه میگید اطلاعات رو در ماتریسهای کوچکتر ذخیره کنم دقیقا یعنی چی؟؟؟بدرد کار من میخوره ؟؟ میشه مثال کدی بزنید؟
آخه در مرحله بعد به حاصل این ماتریس نیاز دارم و این ورودی یه تابع هست.
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#5
(۱۳۹۳/۰۸/۲۱, ۰۴:۴۴ ق.ظ)'Fahrenheit' نوشته: من الان ماتریسی دارم که ستونش 9000 هست ، اما سطرش در هرمرحله داره زیاد میشه( با vertcat کردنش به ماتریس دیگری) .. به همین خاطر ارور out of memory در مثلا لوپ 150 داده میشه ..(تا آخر لوپ ها ، هم فکر میکنم تعداد سطر این ماتریس از 1 میلیون هم رد میشه!!!!! )
از اسپارس استفادهکردم بی فایده بود ، از Int8 استفاده کردم بازم هنگ و ....... هرکاری میکنم نمیشه ! رم من 6 گیگ هست.
باید چیکار کنم ؟؟؟ خیلی مهم هست این موضوع ! اینکه میگید اطلاعات رو در ماتریسهای کوچکتر ذخیره کنم دقیقا یعنی چی؟؟؟بدرد کار من میخوره ؟؟ میشه مثال کدی بزنید؟
آخه در مرحله بعد به حاصل این ماتریس نیاز دارم و این ورودی یه تابع هست.

 


سلام.
اگر واقعا باید همه اطلاعات نگه داری بشه (در حد میلیونی)، راهی که به نظرم میرسه اینه که اطلاعات را به طور موقتی در فایل هایی ذخیره کنید (فایل mat یا فایل متنی) و بعد در ادامه اجرای برنامه، آنها را از متلب پاک کنید (تا حافظه خالی شود)، سپس هر وقت که به آنها نیاز داشتید، دوباره آنها را از فایل های ذخیره شده، فراخوانی کرده و پردازش کنید.
دقت کنید که ذخیره سازی و فراخوانی اطلاعات را با کدنویسی انجام بدهید (نه به صورت دستی).
مثلا شما گفتید که باید هر بار نتیجه یک سری پردازش، به یک ماتریس افزوده بشه. خوب شما اصلا اطلاعات ماتریس را در یک فایل متنی ذخیره کنید. هر بار هم یک سطر به سطرهای فایل متنی اضافه می شود (یعنی افزوده شدن یک سطر به اطلاعات ماتریس). خوب حالا ممکنه بگید که موقعی که می خواهیم ماتریس نهایی (همون که در حد میلیونی ردیف دارده) رو پردازش کنیم، چه کار باید کرد (نمیشه که اون رو وارد متلب کنیم). برای این موضوع هم راه حل ساده است، نیازی نیست که کل ماتریس را از فایل متنی خوانده و در حافظه متلب بیاوریم، بلکه مثلا فرض کنید برای پردازش، به اطلاعات ردیف 10050 ام ماتریس نیاز داریم، برای این منظور، اطلاعات ذخیره شده در فایل متنی که مربوط به ردیف 10050 است را می خوانیم و در حافظه متلب می آوریم و پردازش های لازم را بر روی آنها انجام می دهیم.
ولی به هر حال، باز هم توصیه می کنم که ببینید واقعا نیاز دارید که همه اطلاعات نگه داری شود یا نه، اگر لازم بود آنگاه درگیر موارد فوق شوید.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط Fahrenheit

سایز ماتریس در متلب (خطای Out of memory)

#6
(۱۳۹۳/۰۸/۲۱, ۱۲:۰۵ ب.ظ)'admin' نوشته:
(۱۳۹۳/۰۸/۲۱, ۰۴:۴۴ ق.ظ)'Fahrenheit' نوشته: من الان ماتریسی دارم که ستونش 9000 هست ، اما سطرش در هرمرحله داره زیاد میشه( با vertcat کردنش به ماتریس دیگری) .. به همین خاطر ارور out of memory در مثلا لوپ 150 داده میشه ..(تا آخر لوپ ها ، هم فکر میکنم تعداد سطر این ماتریس از 1 میلیون هم رد میشه!!!!! )
از اسپارس استفادهکردم بی فایده بود ، از Int8 استفاده کردم بازم هنگ و ....... هرکاری میکنم نمیشه ! رم من 6 گیگ هست.
باید چیکار کنم ؟؟؟ خیلی مهم هست این موضوع ! اینکه میگید اطلاعات رو در ماتریسهای کوچکتر ذخیره کنم دقیقا یعنی چی؟؟؟بدرد کار من میخوره ؟؟ میشه مثال کدی بزنید؟
آخه در مرحله بعد به حاصل این ماتریس نیاز دارم و این ورودی یه تابع هست.


 


سلام.
اگر واقعا باید همه اطلاعات نگه داری بشه (در حد میلیونی)، راهی که به نظرم میرسه اینه که اطلاعات را به طور موقتی در فایل هایی ذخیره کنید (فایل mat یا فایل متنی) و بعد در ادامه اجرای برنامه، آنها را از متلب پاک کنید (تا حافظه خالی شود)، سپس هر وقت که به آنها نیاز داشتید، دوباره آنها را از فایل های ذخیره شده، فراخوانی کرده و پردازش کنید.
دقت کنید که ذخیره سازی و فراخوانی اطلاعات را با کدنویسی انجام بدهید (نه به صورت دستی).
مثلا شما گفتید که باید هر بار نتیجه یک سری پردازش، به یک ماتریس افزوده بشه. خوب شما اصلا اطلاعات ماتریس را در یک فایل متنی ذخیره کنید. هر بار هم یک سطر به سطرهای فایل متنی اضافه می شود (یعنی افزوده شدن یک سطر به اطلاعات ماتریس). خوب حالا ممکنه بگید که موقعی که می خواهیم ماتریس نهایی (همون که در حد میلیونی ردیف دارده) رو پردازش کنیم، چه کار باید کرد (نمیشه که اون رو وارد متلب کنیم). برای این موضوع هم راه حل ساده است، نیازی نیست که کل ماتریس را از فایل متنی خوانده و در حافظه متلب بیاوریم، بلکه مثلا فرض کنید برای پردازش، به اطلاعات ردیف 10050 ام ماتریس نیاز داریم، برای این منظور، اطلاعات ذخیره شده در فایل متنی که مربوط به ردیف 10050 است را می خوانیم و در حافظه متلب می آوریم و پردازش های لازم را بر روی آنها انجام می دهیم.
ولی به هر حال، باز هم توصیه می کنم که ببینید واقعا نیاز دارید که همه اطلاعات نگه داری شود یا نه، اگر لازم بود آنگاه درگیر موارد فوق شوید.



 


میشه یه مثال بصورت کد بزنید ؟ ذخیره کردن ، بعد پاک کردن چطور انجام میشه ؟ میدونم با save ذخیره میکنه ، اما چه زمانی باید پاک کرد ؟ اصلا چگونه؟؟
 
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#7
درواقع بهتره کد رو بذارم ببینین(چون همه کد رو نیاوردم ، توضیحاتی در کد دادم که داره چه اتفاقی میفته ، هرچند شاید اینا مهم نباشه)، قسمتی که فارسی نوشتم رو ببینین ، اینجا همونجایی هست که ارور میده ، اینا در هرمرحله زیادمیشن ، یعنی  این 2 ماتریس هر 2 دارای سطری بالاتر از 1 میلیون میشن ، هرچند من در ادامه برنامه خودم (بعد از پایان حلقه) فقط به Xfreq_last  نیاز دارم که باید بدمش به الگوریتم خاصی.(یه جورایی این ماتریس، تعداد فراوانیمه)

کد پی‌اچ‌پی:
for docx :  length(DBlast)
        
docx
        
for word length(DBlast{docx})
            
            % 
In docx we search all words in docx
            
            word_xi 
DBlast{docx}{word,1}    ;
            
            for 
docy length(DBlast)
                
                % While 
the source words are from docx search for them in
                
the rest of documents
                
                
% if word_1i found in document i(=docvote 1
                
if sum(strcmpi(DBlast{docy},word_xi)) ~= 0
                    
                    ind 
find(strcmpi(DBlast{docy},word_xi) ~= 0) ;
                    
                    
                    
Xbool(word,docy) = ;
                    
Xfreq(word,docy) = Freqlast{docy}(ind) ;
                    
     
                else
                    % else 
vote 0
                    Xbool
(word,docy) = ;
                    
Xfreq(word,docy) = ;
                    
                
end
            end
        end
        
این 2 ماتریس بزرگ می شوند
:
               
Xbool_last = [Xbool_last;Xbool];            
               
Xfreq_last = [Xfreq_last;Xfreq];

        
        
Xbool = [] ;
        
Xfreq = [] ;
        
    
end 
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#8
دو خط زیر برامون مهمه که در آنها، یک ردیف به هر یک از دو ماتریس افزوده اید :

کد:
Xbool_last = [Xbool_last;Xbool];
Xfreq_last = [Xfreq_last;Xfreq];

درگیر کدنویسی شما نمی شوم، اما سعی می کنم یک مبحث در این زمینه بنویسم که چگونگی ذخیره مقادیر یک ماتریس در یک فایل متنی (به صورت افزودن ردیف جدید) و همچنین چگونگی فراخوانی آنها (فراخوانی یک ردیف) را آموزش بدهد.
معلوم نیست کی آماده شود، ولی در چند روز آینده، هر از گاهی به سایت سر بزنید (لینک آن را هم در این موضوع قرار می دهم).
برای آشنایی با نوشتن متن در یک فایل متنی و یا خواندن متن از یک فایل متنی، برخی از کلیدهای موجود در دسته بندی زیر کمکتون میکنه (نگاهی به آنها بیندازید) :

http://www.kelidestan.com/keys/categorie...Category=9

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#9
(۱۳۹۳/۰۸/۲۱, ۰۷:۲۶ ب.ظ)'admin' نوشته: دو خط زیر برامون مهمه که در آنها، یک ردیف به هر یک از دو ماتریس افزوده اید :


کد:
Xbool_last = [Xbool_last;Xbool];
Xfreq_last = [Xfreq_last;Xfreq];

درگیر کدنویسی شما نمی شوم، اما سعی می کنم یک مبحث در این زمینه بنویسم که چگونگی ذخیره مقادیر یک ماتریس در یک فایل متنی (به صورت افزودن ردیف جدید) و همچنین چگونگی فراخوانی آنها (فراخوانی یک ردیف) را آموزش بدهد.
معلوم نیست کی آماده شود، ولی در چند روز آینده، هر از گاهی به سایت سر بزنید (لینک آن را هم در این موضوع قرار می دهم).
برای آشنایی با نوشتن متن در یک فایل متنی و یا خواندن متن از یک فایل متنی، برخی از کلیدهای موجود در دسته بندی زیر کمکتون میکنه (نگاهی به آنها بیندازید) :

http://www.kelidestan.com/keys/categorie...Category=9



 

یه سوال دارم ، برای لود کردن اون اطلاعات( ماتریس 1 میلیون در 9000 تایی) ، آیا میشه همش رو باهم لود کرد ؟؟ آخه من باید کلش رو بدم به بقیه کد !بعدش پاک کردن بلافاصله بعد از ذخیره ، یعنی چی ؟؟
یه مثال کوچیک بزنین من انجام میدما ...
اینو میشه بگید ؟؟؟؟؟؟
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#10
منظورم پاک کردن از حافظه متلب بود، یعنی اطلاعات را در فایل متنی قرار می دهیم و بعد با دستور clear ، متغیرهای مورد نظر رو از حافظه متلب پاک می کنیم.
نه، همه ماتریس رو که نمی تونید load کنید. اینجوری چون بازم ماتریس خیلی بزرگه به مشکل بر می خورید.
پس نوشتن مبحث رو بی خیال میشیم :

   ------->       

شما خیلی ساده بفرمایید که پردازش مرحله بعدی چگونه است تا ببینم آیا میشه فکری براش کرد یا نه.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#11
(۱۳۹۳/۰۸/۲۱, ۰۸:۰۹ ب.ظ)'admin' نوشته: منظورم پاک کردن از حافظه متلب بود، یعنی اطلاعات را در فایل متنی قرار می دهیم و بعد با دستور clear ، متغیرهای مورد نظر رو از حافظه متلب پاک می کنیم.
نه، همه ماتریس رو که نمی تونید load کنید. اینجوری چون بازم ماتریس خیلی بزرگه به مشکل بر می خورید.
پس نوشتن مبحث رو بی خیال میشیم :

   ------->       

شما خیلی ساده بفرمایید که پردازش مرحله بعدی چگونه است تا ببینم آیا میشه فکری براش کرد یا نه.



 

توضیحش سخته ، شما فکر کنین باید این ماتریس که دارای میلیون سطر و 9000 ستون هست ، به ورودی یه چیزی داده بشه که میاد فراوانی هر کدوم رو در برعکس فراوانیش در کل ماتریس ضرب میکنه(یه جور الگوریتمه) .
سپس ، بعد از این مرحله، باید بیام مثلا 20 تا از بیشترین ها رو "sort" کنم و .... از اینجا شاید یه کم ماتریس کوچیکتر شه! یعنی قاعدتا میشه!

در کل باید من یه راهی پیدا کنم برای این ماتریس میلیونی !! یه نفر بهم گفت بیا از چند متغیر استفاده کن و هر قسمت از ماتریس رو بریز توی یه متغیر ، مثلا اگه سطر ماتریس بین 1 تا 5000 بود بریز توی x1 و ... (نمی دونم راه حل درستی هست یا نه)
با دستور eval
یه همچین چیزی:

کد:
eval(['x', num2str(i), ' = ', num2str(i)])

ولی من هرکاری کردم نتونستم درست پیاده سازیش کنم!
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#12
بخشی رو که گفتید ((فراوانی هر کدوم رو در برعکس فراوانیش در کل ماتریس ضرب میکنه))، فرمولش رو به صورت عکس پیوست کنید. تا دقیقا ببینم به چه صورت هست.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#13
(۱۳۹۳/۰۸/۲۲, ۰۲:۰۵ ب.ظ)'admin' نوشته: بخشی رو که گفتید ((فراوانی هر کدوم رو در برعکس فراوانیش در کل ماتریس ضرب میکنه))، فرمولش رو به صورت عکس پیوست کنید. تا دقیقا ببینم به چه صورت هست.


 

عکس خوب درنمیومد من کد ادامش رو براتون آوردم با ذکر این توضیح که X  همون ماتریس مدنظر هست (میلیونی!)

کد پی‌اچ‌پی:
function [Y w] = tfidf2param)

switch 
param
    
case 'Boolean'
        
        
% FUNCTION applies TF-IDF weighting to word count vector matrix.
        %
        %   [
Y w] = tfidf2);
        %
        % 
INPUT :
        %   
X        word count vectors (one column one document)
        %
        % 
OUTPUT :
        %   
Y        TF-IDF weighted document-term matrix
        
%   w        IDF weights (useful to process other documents)
        %
        
        % 
get inverse document frequencies
        w 
idf);
        
        % 
TF IDF
        Y 
tf1) .* repmatw1size(X,2) );
        
    case 
'Logarithmic'
        
        
get inverse document frequencies
        w 
idf);
        
        % 
TF IDF
        Y 
tf2) .* repmatw1size(X,2) );
        
end


end

function tf1)
SUBFUNCTION computes word frequencies(Boolean)

./ repmatsum(X,1), size(X,1), );
Yisnan(Y) ) = 0;
end


function tf2)
SUBFUNCTION computes word frequencies(Logarithmic)

log(1+X) ;

./ repmatsum(X,1), size(X,1), );
Yisnan(Y) ) = 0;


end



function idf(X)
SUBFUNCTION computes inverse document frequencies

% % count the number of words in each document
counto the number of documents the term is repestead in
nz 
sum( ( ), );

compute idf for each document
logsize(X,2) ./ (nz(:) + 1) );

end 
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#14
راهی نیست ادمین عزیز؟
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#15
من چگونگی چک کردن را به شما یاد می دهم، بعد خودتان کل کدها را چک کنید.
مطابق روشی که من گفتم (که متغیرها را در فایل ها ذخیره کرده و هنگام پردازش، آنها را از فایل خوانده و بعد نتیجه پردازش را در فایل هایی جدید ذخیره کنیم)، تنها در صورتی به مشکل بر می خوریم که کل ماتریس برای یک پردازش نیاز باشد. خوب حالا قصد داریم که ببینیم خط زیر با این روشی که من گفتم، اجرا میشه یا نه :

کد پی‌اچ‌پی:
nz sum( ( ), ); 

فرض می کنیم که X را در یک فایل متنی داریم (مثلا فایلی با نام X.txt)، ابتدا می خواهیم عبارت زیر را به دست آوریم :

کد پی‌اچ‌پی:


عبارت فوق، ماتریسی را می دهد که هم اندازه ماتریس X است که هر عنصری از ماتریس X که بزرگتر از عدد 0 بوده، را به 1 تبدیل می کنیم و هر عنصری از ماتریس X که کوچکتر یا مساوی عدد 0 بوده را به 0 تبدیل می کنیم. ما یک فایل با نام X_bigger_than_0.txt می سازیم و هر عنصر ماتریس X را از فایل  X.txt خوانده و مطابق منطق مورد نظر، به 0 یا 1 تبدیل کرده و در فایل X_bigger_than_0.txt  ذخیره می کنیم.
خوب حالا می رویم سراغ عبارت زیر :

کد پی‌اچ‌پی:
nz sum( ( ), ); 

دستور sum برای جمع زدن عناصر ماتریس در یک جهت خاص می باشد که چون عدد 2 را در آن ذکر کرده اید، یعنی باید عناصر را در جهت ردیف ها (جمع اعداد هر ردیف) محاسبه کنیم. بنابراین باید از فایل  X_bigger_than_0.txtمقادیر  را تک تک فراخوانی کرده و با هم جمع بزنیم، نتیجه را هم که به صورت یک بردار است، در یک فایل با نام nz.txt ذخیره می کنیم.

بنابراین مطابق همین روندی که گفتم، شما سایر کدها را هم چک کنید و ببینید که به همین شیوه می توان آنها را اجرا کرد یا خیر.
به موردی که حدس می زنم ایراد بگیرید، نحوه دادن ورودی به تابع ها است، مثل کد زیر :

کد پی‌اچ‌پی:
function idf(X

ممکنه بگید که خوب این خط از کدها، کل X را می خواهد. ولی پاسخ من این است که شما باید ورودی توابع را به صورتی تعریف کنید که نام فایل ها (مثلا X.txt) را دریافت کرده و بر اساس آن نام، فایل را فراخوانی کرده و عملیات ها را انجام بدهند.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#16
(۱۳۹۳/۰۸/۲۳, ۰۷:۴۴ ب.ظ)'admin' نوشته: مطابق روشی که من گفتم (که متغیرها را در فایل ها ذخیره کرده و هنگام پردازش، آنها را از فایل خوانده و بعد نتیجه پردازش را در فایل هایی جدید ذخیره کنیم)،
 

منظورتون از این جمله چیه ؟
یعنی اطلاعات رو در یک فایل متنی ذخیره کنم بجای ذخیره شدن در RAm ؟ و اونو لود کنم(با چیزایی که در ادامش فرمودید)
خب قسمت اولش رو به چه شکل انجام بدم ؟

آخه وقتی مثلا می نویسم save.. ذخیره میکنه ، بعدش بیام clear کنم؟ خب دوتا مشکل پیش میاد ، اول اینکه چون توی for داره میچرخه هردفعه باید آپدیت بشه ، (سایز ماتریس بزرگ میشه) دفعه اول اوکی هست ، اما دفعه دوم که باید ردیف بهش اضافه بشه ارور میده!
دوم اینکه ، مگه اول نباید در خود متلب ماتریس ساخته بشه ، بعدش save کنم؟ خب در این صورت که وقتی ساخته میشه بازم RAM و درواقع حافظه بالا میره و تا مرحله بعدش که clear کنم نمی رسه!
شاید هم من بد فهمید منظورتونو

 
اصلا از چی استفاده کنم ؟
dlmwrite
csvwrite

میشه با یه مثال کوچیک کوچیک توضیح بدید؟؟؟؟؟؟؟؟؟؟
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#17
(۱۳۹۳/۰۸/۲۴, ۰۲:۴۹ ب.ظ)'Fahrenheit' نوشته:
(۱۳۹۳/۰۸/۲۳, ۰۷:۴۴ ب.ظ)'admin' نوشته: مطابق روشی که من گفتم (که متغیرها را در فایل ها ذخیره کرده و هنگام پردازش، آنها را از فایل خوانده و بعد نتیجه پردازش را در فایل هایی جدید ذخیره کنیم)،
 

منظورتون از این جمله چیه ؟
یعنی اطلاعات رو در یک فایل متنی ذخیره کنم بجای ذخیره شدن در RAm ؟ و اونو لود کنم(با چیزایی که در ادامش فرمودید)
 

اصلا هدف ما از ذخیره کردن در فایل، اینه که دیگه توی RAM نباشه. چون ما RAM کم میاریم.
من دقیقا توی ارسال های قبلی روند عملیات رو براتون گفتم، همون ارسال ها را دوباره بخوانید.

(۱۳۹۳/۰۸/۲۴, ۰۲:۴۹ ب.ظ)'Fahrenheit' نوشته: خب قسمت اولش رو به چه شکل انجام بدم ؟

آخه وقتی مثلا می نویسم save.. ذخیره میکنه ، بعدش بیام clear کنم؟ خب دوتا مشکل پیش میاد ، اول اینکه چون توی for داره میچرخه هردفعه باید آپدیت بشه ، (سایز ماتریس بزرگ میشه) دفعه اول اوکی هست ، اما دفعه دوم که باید ردیف بهش اضافه بشه ارور میده!
دوم اینکه ، مگه اول نباید در خود متلب ماتریس ساخته بشه ، بعدش save کنم؟ خب در این صورت که وقتی ساخته میشه بازم RAM و درواقع حافظه بالا میره و تا مرحله بعدش که clear کنم نمی رسه!
شاید هم من بد فهمید منظورتونو
 

با دستور save یک MAT-file ساخته میشه که متغیرها درون اون ذخیره شده اند که اصلا برای مورد شما مناسب نیست چون اندازه فایل، خیلی بزرگ میشه. شما باید فایل متنی بسازید.
هر بار ما یک ردیف جدید برای ماتریس به دست می آوریم، پس هر بار یک خط جدید در فایل متنی (با پسوند txt) می نویسیم (اطلاعات قبلی ماتریس در فایل متنی ذخیره است، نه در RAM). اگر قرار باشه کل ماتریس رو توی حافظه نگه داریم که فرقی نمیکنه.
در هر مرحله ای که نیاز به اطلاعات ماتریس بود، آن اطلاعات را از فایل می خوانیم (مثلا ردیف 50000 یا عنصر با ردیف 60000 و ستون 500).

(۱۳۹۳/۰۸/۲۴, ۰۲:۴۹ ب.ظ)'Fahrenheit' نوشته: اصلا از چی استفاده کنم ؟
dlmwrite
csvwrite

میشه با یه مثال کوچیک کوچیک توضیح بدید؟؟؟؟؟؟؟؟؟؟
 

این دو دسته را ببینید :

http://www.kelidestan.com/keys/categorie...ategory=18

http://www.kelidestan.com/keys/categorie...Category=9

خودتون متوجه می شوید که چگونه اطلاعات را در فایل متنی ذخیره کنید و چگونه اطلاعات ذخیره شده را بخوانید (مثال هایی در مورد نوشتن و خواندن از فایل های متنی در آن دسته بندی ها است).

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط Fahrenheit

سایز ماتریس در متلب (خطای Out of memory)

#18
مهندس ، من خروجی رو در هرمرحله ریختم توی فایل متنی. بیش از 8 گیگ شد.
الان قسمت خیلی خیلی کوچکی از فایل نهایی یعنی  X که (همون ماتریس میلیونی) خدمتتون قبلا عرض کرده بودم رو پیوست کردم. لطفا یه نگاهی می کنین ؟
من برای خوندنش(ادامه کار) و دادنش به Y ، واقعا نمی دونم باید چه کنم..
textscan و.. هم چون فایل رو داخل متلب میارن قابل استفاده نیست .. توضیحاتی هم که فرموده بودید رو هم نتونستم کامل روش اعمال کنم..
لطفا یه نگاهی میندازین؟


فایل‌های پیوست

دانلود a_freq.txt

نام فایل a_freq.txt
نوع فایل .txt
دفعات دانلود 248
اندازه 531.51 KB
ارسال کننده فایل Fahrenheit
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#19
سلام
مهندس میشه کمکی کنید ؟
پاسخ

سایز ماتریس در متلب (خطای Out of memory)

#20
فرض می کنیم که یک فایل با نام myFile.txt داریم که اطلاعات زیر در آن ذخیره شده است (یک سری اعداد که در بین آنها، کاراکتر فضای خالی (space) می باشد) :

کد پی‌اچ‌پی:
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28 
29 30 31 32 33 34 35 

اکنون قصد داریم که مثلا اطلاعات موجود در خط چهارم این فایل را بخوانیم و سپس اعداد موجود در آن خط را به صورت یک بردار داشته باشیم (که بتوانیم به هر عدد به طور جداگانه دسترسی داشته باشیم). برای این منظور، کدهای متلب زیر را اجرا می کنیم :

کد پی‌اچ‌پی:
clear all
close all
clc

number_of_line 
1;
textread('myFile.txt''%s'number_of_line'delimiter''\n''headerlines'3)
cell2mat(A

مشخصه headerlines را برابر 3 گرفته ایم که یعنی 3 خط اول فایل نادیده گرفته شود (بنابراین اطلاعات از خط چهارم خوانده می شود). number_of_line برابر تعداد خط هایی است که می خواهیم خوانده شود که در این حالت، تنها 1 خط را قصد داریم بخوانیم (این عدد را تغییر ندهید و برای خواندن خط های بعدی، همین کد کلی را تکرار کنید). همچنین علامت مربوط به جداکننده (delimiter) را برابر n\ در نظر گرفته ایم که همان علامت ((رفتن به خط جدید)) است (چون اطلاعات را خط به خط می خوانیم).
نتیجه اجرای کد متلب بالا :

کد پی‌اچ‌پی:


    
'22 23 24 25 26 27 28 '


=

22 23 24 25 26 27 28 

چون حجم فایل شما خیلی زیاد است، باید از کد بالا استفاده کنید و ببینید که تا چه حد برنامه سریع اجرا می شود.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط شماره مجازی امارات


پرش به انجمن:


کاربران در حال بازدید این موضوع: 2 مهمان