۱۳۹۳/۰۷/۰۳, ۰۳:۲۳ ق.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۰۴, ۱۱:۱۷ ق.ظ توسط admin.)
با سلام و خسته نباشید بابت سایت خوبتون
من یک سوال ساده و البته مهم داشتم ، من یه فایل متنی دارم با حدود 15 هزار خط (که من اینجا برای نمونه فایلی با 5 خط رو پیوست کردم! که بهتره با notepad++ بازکنین) ، که من میخوام در هر خط ، فقط یک قسمت از اون خط رو بخونم و در سلولم داشته باشم تا بعدا کاری روش انجام بدم!
من میخوام ، اول فایل متنی 15هزار خطی رو وارد متلب کنم ، بعدش بهش بگم در هر خط ، از اول تا docno رو حذف کنه و از انتهای شماره docno یعنی fileid تا انتهای خط رو حذف کنه!
یعنی مثلا برای خط اول بالا ، این باقی بمونه(یعنی فقط قسمت آبی شده):
docno=APE20030803.0000.0096
میشه بگید باید چی کار کنم دقیقا ؟
من اومدم با fopen باز کنم ، بعد مثلا با textscan تغییرش توش بدم ، نشد.
۱۳۹۳/۰۷/۰۴, ۱۱:۱۰ ق.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۰۴, ۱۱:۲۱ ق.ظ توسط admin.)
سلام دوست عزیز.
خیلی ممنون.
راه حل این نوع مسائل، استفاده از دستور strtok می باشد. دستور strtok ، بر اساس علامت یا عبارتی که مشخص می کنیم، رشته (string) را به دو قسمت remain (باقیمانده) و token (آنچه بر اساس آن علامت، از رشته جدا می کنیم) تقسیم می کند.
من کدهایی را به شما ارائه می دهم، اگر متوجه نحوه عملکرد و منطق آنها نشدید، علامت ; را از انتهای کدها بردارید تا متوجه شوید که مرحله به مرحله چه اتفاقی می افتد.
فایل شما دارای نام a.txt است که در آن، اطلاعات زیر وجود دارد (به عنوان مثال، تنها 4 خط را قرار داده اید) :
خروجی به همان صورت است که شما خواستید و در صورت تمایل، می توانید آن را در یک فایل جدید ذخیره کنید یا اینکه در یک متغیر ذخیره کنید (در کد بالا، تنها تک تک خط ها را در خروجی متلب نمایش داده ایم).
من ابتدا عبارت docno را برای تقسیم رشته به دو قسمت انتخاب کردم، اما متوجه شدم که دستور strtok برای آن درست عمل نمی کند، بنابراین در 4 مرحله، علامت = را به عنوان علامت جداکننده (delimiter) در نظر گرفتم و بعد هم عبارت fileid را در نظر گرفتم. در چند مرحله اول، از remain استفاده کرده ایم و در مرحله آخر، از token (منظورم قسمت هایی است که اطلاعات مورد نظر ما در آنها قرار می گیرد).
اگر تعداد خط های فایل a.txt را تغییر دادید (مثلا 1000 خط)، باید متغیر number_of_lines را برابر همان تعداد قرار بدهید.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
۱۳۹۳/۰۷/۰۵, ۰۸:۰۶ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۰۵, ۰۸:۰۶ ب.ظ توسط Fahrenheit.)
سلام
خیلی خیلی ممنونم از زحمتتون. دقیقا همونی شد که میخوام ، یه سری تغییرات هم دادم بهش ، واقعا عالی شده.
سوالاتی داشتم
1- nn چه نقشی داره ؟ چرا 3 گذاشتید ؟ نفهمیدم
2- من یه سری فایل دارم که در پوشه ای هست مثلا پوشه 1، که در این پوشه فایلهایی مشابه همون ادامه docno که قبلا بهتون گفته بودم ، قرار داره:
حالا من میخوام از این پوشه ، بیاد اسامی فایلها رو با خروجی ِ همون برنامه که شما لطف کردید و نوشتید مقایسه کنه و اونایی که در اون هست، رو نمایش بده. همین.
میشه در این زمینه هم راهنماییم کنین ؟
یک دنیا ممنونم.
خواهش می کنم.
nn متغیر حلقه است، البته آن را در کدهای حلقه for به کار نبرده ایم و تنها هدفمان این بوده که کد موجود در حلقه، 3 بار اجرا شود تا بخش های ابتدایی رشته (string) حذف شوند.
دستور dir در متلب، لیست نام فایل های موجود در یک پوشه (folder) را به شما می دهد، در مرحله بعد، با دستور strcmp یا دستور strcmpi ، نام های آنها را با رشته هایی که دارید، مقایسه کنید. این دو دستور را در کلیدهای زیر شرح داده ایم :
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
۱۳۹۳/۰۷/۰۶, ۰۳:۲۸ ق.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۰۶, ۰۵:۲۷ ب.ظ توسط admin.)
با سلام و تشکر دوباره
طبق دستوراتتون جلو رفتم ، برای 1 نمونه به جواب رسید که مثلا با strcmp اگه درست بود 1 میده وگرنه ، 0 .
روی 10 تا فایل تست کردم،
وقتی در حلقه قرارش میدم ، در حالت strcmp=1 اوکیه و جواب میداد، اما در حالت 0 ، اعداد "چندبار" تکرار میکنه که مشخصه زیادی داره چاپ میکنه و حلقه اشتباهاتی داره
میشه کد رو ملاحظه کنین و اشتباهم رو بهم بگید؟
کد:
d=dir('1');
Id = setdiff({d.name},{'.','..'});
for j=1:length(Id)
for i=1:length(new_data)
if strcmp(new_data(i),Id(j))==0
disp(Id{j});
end
end
end
۱۳۹۳/۰۷/۰۶, ۰۵:۳۵ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۰۶, ۰۵:۴۰ ب.ظ توسط admin.)
اگر قصد دارید که فایل هایی که نامشان در نتایج وجود دارد نمایش داده شوند، باید اگر تابع strcmp مقدار 1 را برگرداند، آنگاه نام تابع را در خروجی نمایش بدهید.
علاوه بر این، فکر کنم متوجه شدم مشکلتون از چیه. Id یک متغیر از جنس آرایه سلولی (cell array) است، بنابراین برای ارجاع به سلول های (cell) آن، باید علامت های { و } را به کار ببرید :
کد:
Id{1}
بررسی کنید و ببینید که در نتیجه خروجی، تفاوتی میکنه یا خیر.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
۱۳۹۳/۰۷/۰۷, ۰۵:۵۰ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۰۸, ۱۰:۳۴ ق.ظ توسط admin.)
سلام دوباره
ممنون از توجه و پیشنهاداتتون ، مشکل حل شده و این قسمت برنامه رو به کمکتون انجام دادم.
اما یه مشکلی هست ، نمی دونم باید چی کار کنم!
ببینید ، اون فایلی که ابتدای این تاپیک بهتون دادم (که گفتم درواقع 15هزارخطیه ، اما من 5تاش ُ دادم) و گفته بودم که توی یک پوشه ای هم این docno ها قرار دارن.
شما یه خطش رو به عنوان مثال یه بار دیگه نگاه کنید:
قسمت docno به لطفتون جدا شد، اما قسمت topicid رو اگه ببینید ، نوشته 55001 ، یعنی docno به شماره APE20030803.0000.0096 مربوط به تاپیک(topicid) شماره 55001 هست و برای هر 15 هزار خط این قضیه وجود داره.
من باید بتونم مثلا از topicid به شماره 55001 ، بیام(بصورت تصادفی) مثلا 30 تا docno بردارم ، از topicid=55002 ، بیام 30 تا بردارم ، از topicid=55003 بیام 30تا و .... الی آخرین topicid که 55100 هست ، 30تا بردارم و روی این docno ها یه سری الگوریتم رو پیاده سازی کنم و در آخر بگم که آیا docno ی شماره X در topicid ، مربوط به خودش بوده یا نه..
الان مشکل من اینه که نمی دونم باید چطور docno و topicid مربوط به اون رو با هم داشته باشم که قابل استفاده باشه.. یعنی بگه topicid مربوط به docno = APE20030803.0000.0096 ، شماره مثلا 55001 هست (و غیره..) که بعدش بتونم بگم 30 تا داکیومنت از موضوع اولی بهم بده ، 30 تا از دومی و ...
۱۳۹۳/۰۷/۰۸, ۱۰:۴۱ ق.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۰۸, ۱۰:۴۲ ق.ظ توسط admin.)
اگر تعداد مشخص است، حلقه for بسازید و 30 تا 30 تا، مقادیر را جدا کنید. یا اگر تعداد مشخص نیست، دستور if را به کار ببرید که هر وقت مقدار topicid تغییر کرد، متوجه شوید که سری جدید اطلاعات شروع می شود.
تمام نکات لازم رو براتون ذکر کردم. با استفاده از همان نکات می توانید برنامه مورد نظرتان را بنویسید.
موفق باشید.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
۱۳۹۳/۰۷/۲۵, ۰۳:۰۹ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۲۶, ۱۲:۳۵ ق.ظ توسط Fahrenheit.)
با سلام و احترام
برنامه با راهنمایی های شما خیلی پیشرفت کرده ، ممنونم
2 سوال کوچیک داشتم
1- برای مقایسه بیش از یک رشته باید چیکار کرد ؟ مثلا من میخوام در دیتابیسم(DB1) بگرده ببینه ، آیا 4 کلمه family و ground و body و moved هست ؟؟؟ یا از strfind باید استفاده کرد یا میشه از strcmpi به شکل زیر استفاده کرد .. (کدومش درسته ؟)
بعدش من اومدم "یا منطقی" گذاشتم ، آیا درسته ؟؟؟؟
مثلا این کد(باید چه تغییری کنه)
count=0;
DB1_size = size(DB1);
for p=1:DB1_size(2)
if strcmpi(DB1{p}, 'family') | strcmpi(DB1{p}, 'demands')| strcmpi(DB1{p}, 'body')| strcmpi(DB1{p}, 'moved')
% fprintf('\n Found ')
% disp('found');
count=count+1;
% copyfile(file_name,des_file_addr)
end
end
p=p+1;
count
% fprintf('\n count= %g',count)
در مورد اینکه or یا and باشه، بستگی به نوع کاربرد مورد نظرتان دارد. در ضمن، بنده در تعریف DB1 ، دو عنصر دیگر به انتهای آن اضافه کردم، زیرا هیچکدام از آن 4 رشته در آن قرار نداشت و من میخواستم که کدها را تست کنم.
در مورد استفاده از دستور size مراقب باشید، زیرا این دستور، اگر یک بردار را دریافت کند، یک بردار با دو عنصر را برمی گرداند (یکی برای تعداد ستون و یکی برای تعداد ردیف)، پس باید بدانید که تعداد کل عنصرها در کدامیک از آن دو ذخیره شده و به همان اشاره کنید.
نتیجه اجرای کد متلب بالا :
کد:
count =
2
در مورد حذف یک زیررشته (substring) از یک رشته (string)، می توانید از strrep استفاده کنید که برای جایگزینی یک زیررشته (substring) با یک رشته دلخواه به کار می رود و تنها باید تعیین کنید که با عبارت تهی جایگزین شود (بنابراین حذف خواهد شد). برای این منظور، کلید زیر را بخوانید :
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
بازم ممنونم ، مشکل حل شد ..
توضیحات کامل و جامعی بود .. خیلی لطف کردید
جسارتا سوالی داشتم ، در نظر بگیرید که 5تا فایل txt به نام های : 1،2،3،4 و 5 دارید ، شماره های 1 و2 در پوشه A ، شماره 3و4 در پوشه B و شماره 5 در پوشه ای به نام C هست..
حالا در متلب من اومدم ، همه این 5تا فایل رو در یه پوشه به نام test ریختم و مثلا از یک الگوریتم دسته بندی(حالا مهم نیست چی باشه ، فکر کنید مثلا kmeans) استفاده کردم و خروجی اون بهم نشون داد که فایهای شماره 1و2و3 در "دسته اول" و فایلهای 4,5 در "دسته دوم" قرار گرفتند.
به صورت چشمی ، میشه فهمید که الگوریتم من نسبت به حالت واقعی چقدر قوی یا ضعیف بوده(چقدر درست تشخیص داده) ، اما وقتی که تعداد فایلها زیاد بشه (مثلا 1000تا ) دیگه چشم قادر به این نیست که بفهمه چقدر الگوریتم نسبت به حالت واقعی درست کار کرده.
درواقع باید فرمولی باشه که صورتش : نتیجه الگوریتم من و مخرجش : حالت واقعی ، باشه تا بشه نتیجه رو بصورت "درصد" اعلام کرد.
۱۳۹۳/۰۷/۲۸, ۰۷:۳۴ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۲۸, ۰۷:۳۶ ب.ظ توسط admin.)
چون شما فایل ها را در پوشه (folder) صحیح دارید (هر نوع در یک پوشه قرار می گیرد)، بنابراین تنها باید تشخیص بدهید که آیا پوشه مربوط به فایل (که در واقع متناظر با نوع فایل است)، درست تشخیص داده شده است یا نه. برای این منظور هم، تنها کافی است که ببینید آیا آن فایل در پوشه مورد نظر وجود دارد یا خیر (با کدنویسی).
مثلا فرض کنید که الگوریتم، تشخیص داده که شماره 1 در پوشه B می باشد، بنابراین ما تنها چک می کنیم که شماره 1 در پوشه B وجود دارد یا نه (یعنی فایل با آن نام، در پوشه B قرار دارد یا نه). اگر قرار نداشت، پس این تشخیص، اشتباه بوده است. یک متغیر تعریف کنید که تعداد تشخیص های اشتباه در آن ذخیره شود و در آخر، بر اساس تعداد کل تشخیص ها و تعداد تشخیص های اشتباه، یک درصدی برای میزان صحیح تشخیص دادن الگوریتم به دست می آید.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
۱۳۹۳/۰۷/۲۸, ۰۹:۴۶ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۲۹, ۰۲:۵۸ ب.ظ توسط admin.)
آقای مهندس
یه مشکلی در این کار وجود داره ، من با این عکسا دقیقا منظورم ُ می رسونم
فکر کنید حالت واقعی به این شکل هست :
و روش من اینطور جواب داده :
که ستون cluster_number بیان می کند : هر فایل به کدام دسته تعلق دارد.(که بصورت عددی است)
شما فرمودید "ما تنها چک می کنیم که شماره 1 در پوشه B وجود دارد یا نه " ، اما اینجا ، در روش من ، نشون داده که شماره 1 در دسته 1 هست، حالا دسته 1 چیه ؟ ما نمی دونیم! آیا دسته 1 یعنی پوشه A یا دسته 2 یعنی پوشه B؟ این هم مشخص نیست!
از کجا می فهمیم داستان چیه ؟ از اینجا که مثلا چون از قبل می دونستیم شماره های 1 و 2 باید در دسته ای مشابه قرار می گرفتند ، چون نگرفتند (توی عکس معلومه) پس الگوریتم من درست تشخیص نداده!
در نهایت ، با توجه به مقایسه دو عکس ، دقت الگوریتم من صفر هست !! (این عکسها رو همینجوری گذاشتم ، برای مثال)
نمی دونم چطوری توضیح بدم ، امیدوارم متوجه شده باشید.
راه اول :
هر دسته (هر نوع) را بر اساس تعداد عناصر آن، به یکی از پوشه ها نسبت بدهید. مثلا آن دسته ای که بیشترین تعداد در آن قرار گرفته اند را متناظر با پوشه ای در نظر بگیرید که دارای بیشترین تعداد فایل است. برای دو پوشه دیگر نیز به ترتیب و بر اساس تعداد عناصر، به همین صورت در نظر بگیرید. سپس بر اساس همان روند، درصد خطا را به دست آورید.
راه دوم :
برای متناظر گرفتن پوشه ها با دسته ها (انواع)، چون 3 پوشه هست، پس 6 حالت داریم (3 ضرب در 2 ضرب در 1 که می شود 6 حالت). حالا ما هر کدام از این حالت ها را در نظر می گیریم و درصد خطا را برای آنها محاسبه می کنیم، هر حالتی که درصد خطای آن کمتر باشد را به عنوان حالت صحیح در نظر می گیریم و تناظر بین پوشه ها و دسته ها را بر اساس آن در نظر خواهیم گرفت.
البته راه دوم، دقیقتر اما پر دردسر تر می باشد. این موارد، نظر بنده بود، اگر راه حل بهتری یافتید، خوشحال می شوم که من نیز آن را بدانم.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
۱۳۹۳/۰۷/۲۹, ۱۰:۱۶ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۳۰, ۱۱:۱۳ ب.ظ توسط admin.)
ممنون ، راه اول ، جواب خیلی درستی نمیده. راه دوم هم دردسر زیادی داره ..
ببینین ، من این به ذهنم میرسه :
عکس دوم که نتیجه الگوریتم ما هست رو داریم :
میایم یه برنامه می نویسیم و "نام" ِ اونهایی که مقدار idxشون برابر هست رو برمی داریم(چطوری؟!) ، یعنی با این کار (با توجه به عکس) نام اصلی شماره های 1 ، 3 و 5 را برمی داریم. مثلا اسامی واقعیشون هست: x,y,z
از قبل هم می دونستیم که x در پوشه A هست ، y در پوشه Bو z در پوشه C.
حالا کدی می نویسیم که بگه اگه x در پوشه A هست ، یعنی نتیجه الگوریتم درسته ، در غیر این صورت ، اشتباست ، برای y برعکس میشه ، یعنی اگه y در پوشه A باشه اشتباست (باید در B باشه) و z هم به همین شکل.
در آخر ، درصدگیری رو انجام می دیم(که اینو دیگه نمی دونم چطوری!)
به نظرتون منطقیه ؟ میشه در کُدنویسی ، یه کمکی بهم بکنین ؟ واقعا گیج شدم!
۱۳۹۳/۰۷/۳۰, ۰۲:۲۳ ق.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۸/۰۱, ۰۱:۳۴ ق.ظ توسط Fahrenheit.)
میشه درمورد این پست نظر بدید ؟
داستان از این قراره که من دیدم از قبل که می دونم (این مثال با مثال ِ پستهای قبلی فرق میکنه) از شماره 1 تا 16 در یک فولدرند ، 17 تا 33 در فولدر دیگری و 34 تا 50 در فولدر سوم!
پس اگه idx ِ هر کدوم رو مثلا بیام با یه نماینده(که این واسم سواله ، نوع انتخابش ) از اون گروه مقایسه کنم ، اگه true بود ، یعنی در گروه درستی قرار گرفته ، پس یه شمارنده بشمره ! همین !
فقط به این شکل نوشتم که می بینین ، نتیجه count میده 48 (با چشم هم که نگاه کردم ، 48تاش درست دسته بندی شده بود ) که چون 50 تا داده داشتم ، آخرش اومدم درصد گرفتم و تقسیم بر 50 (درسته ؟)
و سوال آخر اینکه این نوع نوشتن ، بد نیست ؟ اینکه بیام یه for بذارم برای p=1 تا 16 و .. برای هر کدوم یک for ؟؟
آیا میشه همه رو با هم نوشت ؟
کد:
count=0;
for p=1:16
if eq(idx(p),idx(1))
count=count+1;
count
end
end
for p=17:33
if eq(idx(p),idx(17))
count=count+1;
count
end
end
for p=34:50
if eq(idx(p),idx(34))
count=count+1;
count
end
end
۱۳۹۳/۰۷/۳۰, ۱۱:۲۲ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۷/۳۰, ۱۱:۲۷ ب.ظ توسط admin.)
(۱۳۹۳/۰۷/۲۹, ۱۰:۱۶ ب.ظ)'Fahrenheit' نوشته: ممنون ، راه اول ، جواب خیلی درستی نمیده. راه دوم هم دردسر زیادی داره ..
ببینین ، من این به ذهنم میرسه :
عکس دوم که نتیجه الگوریتم ما هست رو داریم :
میایم یه برنامه می نویسیم و "نام" ِ اونهایی که مقدار idxشون برابر هست رو برمی داریم(چطوری؟!) ، یعنی با این کار (با توجه به عکس) نام اصلی شماره های 1 ، 3 و 5 را برمی داریم. مثلا اسامی واقعیشون هست: x,y,z
از قبل هم می دونستیم که x در پوشه A هست ، y در پوشه Bو z در پوشه C.
حالا کدی می نویسیم که بگه اگه x در پوشه A هست ، یعنی نتیجه الگوریتم درسته ، در غیر این صورت ، اشتباست ، برای y برعکس میشه ، یعنی اگه y در پوشه A باشه اشتباست (باید در B باشه) و z هم به همین شکل.
در آخر ، درصدگیری رو انجام می دیم(که اینو دیگه نمی دونم چطوری!)
به نظرتون منطقیه ؟ میشه در کُدنویسی ، یه کمکی بهم بکنین ؟ واقعا گیج شدم!
هنوز هم مشکل این خواهد بود که نمی دانیم هر شماره مربوط به کدام دسته (پوشه) است.
این روش دارای منطق درستی برای پیدا کردن درصد خطا نیست. شما تعدادی عنصر را برای چک کردن انتخاب می کنید (و یک یا چند تا را فرض می کنید که درست تعیین شده اند)، اما همین انتخاب، از کجا معلوم که انتخاب درستی باشه (که بعد بر اساس آنها، بقیه را چک کنید). مثلا شما فرض کردید که نوع (دسته) عنصر A به درستی تعیین شده است، اما از کجا معلوم که درست باشه (مثلا می گویید اگه x در پوشه A هست، ولی خوب پوشه A را که نمی دانیم مربوط به کدام شماره است، بنابراین مجبورید که فرض کنید که درست تعیین شده که فرض با ریسک بالایی خواهد بود). با فرض کردن، نمی توان به پاسخ صحیح رسید. اگر واقعا می خواهید که بهترین حالت را بیابید، به نظرم همان ((روش دوم)) را انتخاب کنید.
در مورد کدنویسی، چون زمان ندارم، نمی تونم کمکی کنم. منطق برنامه را که بیابید، کدنویسی نیز راحت خواهد بود.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
۱۳۹۳/۰۸/۰۱, ۰۳:۲۹ ب.ظ (آخرین تغییر در ارسال: ۱۳۹۳/۰۸/۰۱, ۰۳:۲۹ ب.ظ توسط admin.)
(۱۳۹۳/۰۸/۰۱, ۰۱:۳۱ ق.ظ)'Fahrenheit' نوشته: آقای مهندس من یه پست بعدش دادم که کدنویسی هم کردم. پست شماره 18
اون رو کاش می دیدین ..
نظرتون در مورد کدی که نوشتم چیه ؟
به نظر من، تا زمانی که منطق دقیق برنامه رو مشخص نکردید، به سراغ کدنویسی نروید. روی کاغذ، روند برنامه را بنویسید یا اصلا یک فلوچارت رسم کنید. اینکه من در مورد کدنویسی راهنمایی نمی کنم، به دلیل اینه که وقت کمی در اختیار دارم و تنها در مورد نکات کوچک می توانم کاربران را راهنمایی کنم.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
count=0;
DB1_size = size(DB1);
for p=1:DB1_size(2)
if strcmpi(DB1{p}, 'family') | strcmpi(DB1{p}, 'demands')| strcmpi(DB1{p}, 'body')| strcmpi(DB1{p}, 'moved')
% fprintf('\n Found ')
% disp('found');
count=count+1;
% copyfile(file_name,des_file_addr)
end
end
p=p+1;
count
% fprintf('\n count= %g',count)
در مورد اینکه or یا and باشه، بستگی به نوع کاربرد مورد نظرتان دارد. در ضمن، بنده در تعریف DB1 ، دو عنصر دیگر به انتهای آن اضافه کردم، زیرا هیچکدام از آن 4 رشته در آن قرار نداشت و من میخواستم که کدها را تست کنم.
در مورد استفاده از دستور size مراقب باشید، زیرا این دستور، اگر یک بردار را دریافت کند، یک بردار با دو عنصر را برمی گرداند (یکی برای تعداد ستون و یکی برای تعداد ردیف)، پس باید بدانید که تعداد کل عنصرها در کدامیک از آن دو ذخیره شده و به همان اشاره کنید.
نتیجه اجرای کد متلب بالا :
کد:
count =
2
سلام و خسته نباشید خدمت شما.
می بخشید این کد بالا رو اگه بخوایم بصورت AND بنویسیم (که در متلب با & نشون می دیم) ، کد چطور در میاد ؟ آخه اگه به این شکل زیر بنویسیم و بجای | ما & قرا بدیم ، جواب درستی نمیده(چون اولی رو میاد با این کلمات مقایسه میکنه و چون درست نیست ، جواب نمیده ، در حالی که در متن(حالت واقعی) این 2 کلمه هست .
میشه بگید باید چیکار کنم؟
کد:
if strcmpi(DB1{p}, 'family') && strcmpi(DB1{p}, 'demands')