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



روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟زمان کنونی: ۱۳۹۵/۰۹/۱۸، ۱۲:۱۸ ب.ظ
کاربران در حال بازدید این موضوع: 1 مهمان
نویسنده: Fahrenheit
آخرین ارسال: Fahrenheit
پاسخ 22
بازدید 8156

رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#1
با سلام و خسته نباشید بابت سایت خوبتون

من یک سوال ساده و البته مهم داشتم ، من یه فایل متنی دارم با حدود 15 هزار خط (که من اینجا برای نمونه فایلی با 5 خط رو پیوست کردم! که بهتره با notepad++ بازکنین) ، که من میخوام در هر خط ، فقط یک قسمت از اون خط رو بخونم و در سلولم داشته باشم تا بعدا کاری روش انجام بدم!

یعنی اینکه مثلا یک خط از این فایل رو ببینید :

<ONTOPIC topicid=55001 level=YES docno=APE20030803.0000.0096 fileid=20030803_0000_0737_APW_ENG comments="none">

من میخوام ، اول فایل متنی 15هزار خطی رو وارد متلب کنم ، بعدش بهش بگم در هر خط ، از اول تا docno رو حذف کنه و از انتهای شماره docno یعنی fileid تا انتهای خط رو حذف کنه!
یعنی مثلا برای خط اول بالا ، این باقی بمونه(یعنی فقط قسمت آبی شده):

docno=APE20030803.0000.0096

میشه بگید باید چی کار کنم دقیقا ؟

من اومدم با fopen باز کنم ، بعد مثلا با textscan تغییرش توش بدم ، نشد.
 
خیلی مهمه ..
ممنون میشم


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

دانلود a.txt

نام فایل a.txt
نوع فایل .txt
دفعات دانلود 177
اندازه 559 بایت
ارسال کننده فایل Fahrenheit
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#2
سلام دوست عزیز.
خیلی ممنون. 
راه حل این نوع مسائل، استفاده از دستور strtok می باشد. دستور strtok ، بر اساس علامت یا عبارتی که مشخص می کنیم، رشته (string) را به دو قسمت remain (باقیمانده) و token (آنچه بر اساس آن علامت، از رشته جدا می کنیم) تقسیم می کند.
من کدهایی را به شما ارائه می دهم، اگر متوجه نحوه عملکرد و منطق آنها نشدید، علامت ; را از انتهای کدها بردارید تا متوجه شوید که مرحله به مرحله چه اتفاقی می افتد.
فایل شما دارای نام a.txt است که در آن، اطلاعات زیر وجود دارد (به عنوان مثال، تنها 4 خط را قرار داده اید) :

کد:
<ONTOPIC topicid=55001 level=YES docno=APE20030803.0000.0096 fileid=20030803_0000_0737_APW_ENG comments="none">
<ONTOPIC topicid=55001 level=YES docno=AFE20030801.1207.0511 fileid=20030801_1207_1405_AFP_ENG comments="none">
<ONTOPIC topicid=55001 level=YES docno=APE20030723.1524.0665 fileid=20030723_1524_1719_APW_ENG comments="none">
<ONTOPIC topicid=55001 level=YES docno=NYT20030726.0000.0005 fileid=20030726_0000_2356_NYT_ENG comments="none">
<ONTOPIC topicid=55001 level=YES docno=XIE20030801.1700.0247 fileid=20030801_1700_1900_XIN_ENG comments="none">

در پوشه حاوی این فایل، یک m-file ساخته و کدهای آن را اینگونه می نویسیم :

کد:
clear all
close all
clc

fid = fopen('a.txt');
A = textscan(fid, '%s', 'delimiter', '\n');
number_of_lines = 4;
for Line_Number=1:number_of_lines
    Line_Information = A{1}{Line_Number};
    [token, remain] = strtok(Line_Information, '=');
    for nn=1:3
        [token, remain] = strtok(remain, '=');
    end
    [token, remain] = strtok(token, 'fileid');
    this_line = strcat('docno=',token);
    disp(this_line);
end

نتیجه اجرای کد متلب بالا :

کد:
docno=APE20030803.0000.0096
docno=AFE20030801.1207.0511
docno=APE20030723.1524.0665
docno=NYT20030726.0000.0005

خروجی به همان صورت است که شما خواستید و در صورت تمایل، می توانید آن را در یک فایل جدید ذخیره کنید یا اینکه در یک متغیر ذخیره کنید (در کد بالا، تنها تک تک خط ها را در خروجی متلب نمایش داده ایم).
من ابتدا عبارت docno را برای تقسیم رشته به دو قسمت انتخاب کردم، اما متوجه شدم که دستور strtok برای آن درست عمل نمی کند، بنابراین در 4 مرحله، علامت = را به عنوان علامت جداکننده (delimiter) در نظر گرفتم و بعد هم عبارت fileid را در نظر گرفتم. در چند مرحله اول، از remain استفاده کرده ایم و در مرحله آخر، از token (منظورم قسمت هایی است که اطلاعات مورد نظر ما در آنها قرار می گیرد).
اگر تعداد خط های فایل a.txt را تغییر دادید (مثلا 1000 خط)، باید متغیر number_of_lines را برابر همان تعداد قرار بدهید.

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#3
سلام
خیلی خیلی ممنونم از زحمتتون. دقیقا همونی شد که میخوام ، یه سری تغییرات هم دادم بهش ، واقعا عالی شده.
 سوالاتی داشتم
1- nn چه نقشی داره ؟ چرا 3 گذاشتید ؟ نفهمیدم

2- من یه سری فایل دارم که در پوشه ای هست مثلا پوشه 1، که در این پوشه فایلهایی مشابه همون ادامه docno که قبلا بهتون گفته بودم ، قرار داره:



کد:
AFE20030401.0000.0002
AFE20030401.0000.0003
AFE20030401.0000.0004
AFE20030401.0000.0005

مثلا از اینا حدود 15هزارتا هست.

حالا من میخوام از این پوشه ، بیاد اسامی فایلها رو با خروجی ِ همون برنامه که شما لطف کردید و نوشتید مقایسه کنه و اونایی که در اون هست، رو نمایش بده. همین.
میشه در این زمینه هم راهنماییم کنین ؟
یک دنیا ممنونم.

 
پاسخ
 سپاس شده توسط admin

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#4
خواهش می کنم. 
nn متغیر حلقه است، البته آن را در کدهای حلقه for به کار نبرده ایم و تنها هدفمان این بوده که کد موجود در حلقه، 3 بار اجرا شود تا بخش های ابتدایی رشته (string) حذف شوند.
دستور  dir در متلب، لیست نام فایل های موجود در یک پوشه (folder) را به شما می دهد، در مرحله بعد، با دستور strcmp یا دستور strcmpi ، نام های آنها را با رشته هایی که دارید، مقایسه کنید. این دو دستور را در کلیدهای زیر شرح داده ایم :

http://www.kelidestan.com/keys/keys.php?key=2661

http://www.kelidestan.com/keys/keys.php?key=2662

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#5
ممنون، من حتما تست میکنم و نتیجه رو میگم.
فقط برای ذخیره نتایج اون کد اول ، باید آخرش چه متغیری رو save کنم ؟
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#6
کدهای متلب رو به صورت زیر می نویسیم تا نتایج در یک آرایه سلولی (cell array) با نام new_data ذخیره شوند :

کد:
clear all
close all
clc

fid = fopen('a.txt');
A = textscan(fid, '%s', 'delimiter', '\n');
number_of_lines = 4;

for Line_Number=1:number_of_lines
    Line_Information = A{1}{Line_Number};
    [token, remain] = strtok(Line_Information, '=');
    for nn=1:3
        [token, remain] = strtok(remain, '=');
    end
    [token, remain] = strtok(token, 'fileid');
    this_line = strcat('docno=',token);
    disp(this_line);
    new_data{Line_Number}=this_line;
end

اگر با آرایه های سلولی (cell arrays) آشنایی ندارید، دسته بندی زیر را ببینید :

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

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#7
با سلام و تشکر دوباره
طبق دستوراتتون جلو رفتم ، برای 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
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#8
اگر قصد دارید که فایل هایی که نامشان در نتایج وجود دارد نمایش داده شوند، باید اگر تابع strcmp مقدار 1 را برگرداند، آنگاه نام تابع را در خروجی نمایش بدهید.

علاوه بر این، فکر کنم متوجه شدم مشکلتون از چیه. Id یک متغیر از جنس آرایه سلولی (cell array) است، بنابراین برای ارجاع به سلول های (cell) آن، باید علامت های { و } را به کار ببرید :

کد:
Id{1}

بررسی کنید و ببینید که در نتیجه خروجی، تفاوتی میکنه یا خیر.

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#9
سلام دوباره
ممنون از توجه و پیشنهاداتتون ، مشکل حل شده و این قسمت برنامه رو به کمکتون انجام دادم.
اما یه مشکلی هست ، نمی دونم باید چی کار کنم!

ببینید ، اون فایلی که ابتدای این تاپیک بهتون دادم (که گفتم درواقع 15هزارخطیه ، اما من 5تاش ُ دادم) و گفته بودم که توی یک پوشه ای هم این docno ها قرار دارن.

شما یه خطش رو به عنوان مثال یه بار دیگه نگاه کنید:

کد:
<ONTOPIC topicid=55001 level=YES docno=APE20030803.0000.0096 fileid=20030803_0000_0737_APW_ENG comments="none">

قسمت 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 تا از دومی و ...

ممنون میشم کمکم کنید . واقعا ممنون.
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#10
اگر تعداد مشخص است، حلقه for بسازید و 30 تا 30 تا، مقادیر را جدا کنید. یا اگر تعداد مشخص نیست، دستور if را به کار ببرید که هر وقت مقدار topicid تغییر کرد، متوجه شوید که سری جدید اطلاعات شروع می شود.
تمام نکات لازم رو براتون ذکر کردم. با استفاده از همان نکات می توانید برنامه مورد نظرتان را بنویسید. 
موفق باشید.

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#11
با سلام و احترام
برنامه با راهنمایی های شما خیلی پیشرفت کرده ، ممنونم
2 سوال کوچیک داشتم
1- برای مقایسه بیش از یک رشته باید چیکار کرد ؟ مثلا من میخوام در دیتابیسم(DB1) بگرده ببینه ، آیا 4 کلمه family و ground و body و moved هست ؟؟؟ یا از strfind باید استفاده کرد یا میشه از strcmpi به شکل زیر استفاده کرد .. (کدومش درسته ؟)
بعدش من اومدم "یا منطقی" گذاشتم ، آیا درسته ؟؟؟؟
مثلا این کد(باید چه تغییری کنه)

کلمات در DB1 من به این شکل هست :

DB1 =

'NEW'
'YORK'
'May'
'30'
'(AFP)'
'-'
'US'
'prosecutors'
'on'
'Friday'
'unveiled'
'a'
'14-count'
'indictment'
'including'
'charges'
'of'
'murder'
'and'
'loan'
'sharking'
'against'
.
.
.
.

کد:

کد:
count=0;
            for p=1:size((DB1))
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;
        
        fprintf('\n count= %g',count)


سوال بعدی :

میخوام " " رو از کلمه مورد نظر در متن(مثلا متن زیر) حذف کنم ، باید چیکار کنم؟
family "family" play hard
میخوام تبدیل بشه به :
family family play hard
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#12
سلام.
کمی باید کدها رو تغییر بدهیم :

کد:
clear all
close all
clc

DB1 = {'NEW','YORK','May','30','(AFP)','-','US','prosecutors',...
    'on','Friday','unveiled','a','14-count','indictment',...
    'including','charges','of','murder','and','loan','sharking','against',...
    'body','demands'};

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) با یک رشته دلخواه به کار می رود و تنها باید تعیین کنید که با عبارت تهی جایگزین شود (بنابراین حذف خواهد شد). برای این منظور، کلید زیر را بخوانید :

http://www.kelidestan.com/keys/keys.php?key=2659

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#13
بازم ممنونم ، مشکل حل شد ..
توضیحات کامل و جامعی بود .. خیلی لطف کردید Smile
جسارتا سوالی داشتم ، در نظر بگیرید که 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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

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

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#15
آقای مهندس
یه مشکلی در این کار وجود داره ، من با این عکسا دقیقا منظورم ُ می رسونم

فکر کنید حالت واقعی به این شکل هست :

   

و روش من اینطور جواب داده :

   

که ستون cluster_number بیان می کند : هر فایل به کدام دسته تعلق دارد.(که بصورت عددی است)

شما فرمودید "ما تنها چک می کنیم که شماره 1 در پوشه B وجود دارد یا نه " ، اما اینجا ، در روش من ، نشون داده که شماره 1 در دسته 1 هست، حالا دسته 1 چیه ؟ ما نمی دونیم! آیا دسته 1 یعنی پوشه A یا دسته 2 یعنی پوشه B؟ این هم مشخص نیست!
از کجا می فهمیم داستان چیه ؟ از اینجا که مثلا چون از قبل می دونستیم شماره های 1 و 2 باید در دسته ای مشابه قرار می گرفتند ، چون نگرفتند (توی عکس معلومه) پس الگوریتم من درست تشخیص نداده!

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#16
منظورتون رو متوجه شدم.
دو راه به ذهن من میرسه :

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

راه دوم :
برای متناظر گرفتن پوشه ها با دسته ها (انواع)، چون 3 پوشه هست، پس 6 حالت داریم (3 ضرب در 2 ضرب در 1 که می شود 6 حالت). حالا ما هر کدام از این حالت ها را در نظر می گیریم و درصد خطا را برای آنها محاسبه می کنیم، هر حالتی که درصد خطای آن کمتر باشد را به عنوان حالت صحیح در نظر می گیریم و تناظر بین پوشه ها و دسته ها را بر اساس آن در نظر خواهیم گرفت.

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

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#17
ممنون ، راه اول ، جواب خیلی درستی نمیده. راه دوم هم دردسر زیادی داره ..
ببینین ، من این به ذهنم میرسه :
عکس دوم که نتیجه الگوریتم ما هست رو داریم :

   

میایم یه برنامه می نویسیم و "نام" ِ اونهایی که مقدار idxشون برابر هست رو برمی داریم(چطوری؟!) ، یعنی با این کار (با توجه به عکس) نام اصلی شماره های 1 ، 3 و 5 را برمی داریم. مثلا اسامی واقعیشون هست: x,y,z
از قبل هم می دونستیم که x در پوشه A هست ، y در پوشه Bو z در پوشه C.
حالا کدی می نویسیم که بگه اگه x در پوشه A هست ، یعنی نتیجه الگوریتم درسته ، در غیر این صورت ، اشتباست ، برای y برعکس میشه ، یعنی اگه y در پوشه A باشه اشتباست (باید در B باشه) و z هم به همین شکل.

در آخر ، درصدگیری رو انجام می دیم(که اینو دیگه نمی دونم چطوری!)

به نظرتون منطقیه ؟ میشه در کُدنویسی ، یه کمکی بهم بکنین ؟ واقعا گیج شدم!
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#18
میشه درمورد این پست نظر بدید ؟
داستان از این قراره که من دیدم از قبل که می دونم (این مثال با مثال ِ پستهای قبلی فرق میکنه) از شماره 1 تا 16 در یک فولدرند ، 17 تا 33 در فولدر دیگری و 34 تا 50 در فولدر سوم!
پس اگه idx ِ هر کدوم رو مثلا بیام با یه نماینده(که این واسم سواله ، نوع انتخابش ) از اون گروه مقایسه کنم ، اگه true بود ، یعنی در گروه درستی قرار گرفته ، پس یه شمارنده بشمره ! همین !
فقط به این شکل نوشتم که می بینین ، نتیجه count میده 48 (با چشم هم که نگاه کردم ، 48تاش درست دسته بندی شده بود Smile ) که چون 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

result=(count/50) * 100



 
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#19
(۱۳۹۳/۰۷/۲۹, ۱۰:۱۶ ب.ظ)'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 را که نمی دانیم مربوط به کدام شماره است، بنابراین مجبورید که فرض کنید که درست تعیین شده که فرض با ریسک بالایی خواهد بود). با فرض کردن، نمی توان به پاسخ صحیح رسید. اگر واقعا می خواهید که بهترین حالت را بیابید، به نظرم همان ((روش دوم)) را انتخاب کنید.
در مورد کدنویسی، چون زمان ندارم، نمی تونم کمکی کنم. منطق برنامه را که بیابید، کدنویسی نیز راحت خواهد بود.

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#20
آقای مهندس من یه پست بعدش دادم که کدنویسی هم کردم. پست شماره 18
اون رو کاش می دیدین ..
نظرتون در مورد کدی که نوشتم چیه ؟

 
پاسخ

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#21
(۱۳۹۳/۰۸/۰۱, ۰۱:۳۱ ق.ظ)'Fahrenheit' نوشته: آقای مهندس من یه پست بعدش دادم که کدنویسی هم کردم. پست شماره 18
اون رو کاش می دیدین ..
نظرتون در مورد کدی که نوشتم چیه ؟
 

به نظر من، تا زمانی که منطق دقیق برنامه رو مشخص نکردید، به سراغ کدنویسی نروید. روی کاغذ، روند برنامه را بنویسید یا اصلا یک فلوچارت رسم کنید. اینکه من در مورد کدنویسی راهنمایی نمی کنم، به دلیل اینه که وقت کمی در اختیار دارم و تنها در مورد نکات کوچک می توانم کاربران را راهنمایی کنم.

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

روش استفاده از یک قسمت از هر خط ، در فایل متنی وارد شده در متلب؟؟؟

#22
(۱۳۹۳/۰۷/۲۸, ۱۰:۵۱ ق.ظ)'admin' نوشته: سلام.



کد:
clear all
close all
clc

DB1 = {'NEW','YORK','May','30','(AFP)','-','US','prosecutors',...
'on','Friday','unveiled','a','14-count','indictment',...
'including','charges','of','murder','and','loan','sharking','against',...
'body','demands'};

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')

 
پاسخ


پرش به انجمن:


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

آخرین کلیدهای غیررایگان

شما هم می توانید کلیدهای غیررایگان منتشر کنید (بیشتر بدانید)