رفتن به مطلب

انتخاب بهترین کروموزوم ها


فاطمه-زهرا

ارسال های توصیه شده

سلام

 

یک سری داده (کروموزوم) باینری داریم، میخوایم فقط کروموزوم هایی رو که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همی 1 نیست رو انتخاب کنیم.

ضمن تشکر از آقای انصاری، کدی رو که زحمت کشیدید و نوشتید جواب داد ولی متاسفانه من اصلا متوجه نشدم چکار میکنه.

داده دسیمال من اعدادی بین صفر تا هشته. اول این داده های دسیمال رو به باینری تبدیل کردم. بعد تو یه حلقه گذاشتم. به نظرم اشتباه اومد!

اینم کدش:

 

Pop=xlsread('ِSolar-Data.xls');

Pop1=dec2bin(Pop);

[NPar,NGene]= size(Pop1)

 

for I=1:NPar

for J=1:NGene

if Pop1(1)~=Pop1(NGene)~=1 && Pop(J)~=Pop(J+1)

Pop=BinaryData(I);

end

end

end

 

 

 

می خواستم کد آقای انصاری رو هم تغییر بدم و دیتای خودمو توش بذارم که نتونستم.

 

A = (0:255)';

Bin_A_cell = arrayfun(@(x) bitget(x,8:-1:1),A,'Un',0);

Bin_A = cell2mat(Bin_A_cell);

 

idx1 = ~any(Bin_A(:,1:7) .* Bin_A(:,2:8),2);

idx2 = Bin_A(:,1)~= 0 & Bin_A(:,8)~= 0;

 

[A(idx1 & idx2) Bin_A(idx1 & idx2,:)]

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه
  • پاسخ 50
  • ایجاد شد
  • آخرین پاسخ

بهترین ارسال کنندگان این موضوع

بهترین ارسال کنندگان این موضوع

سلام

 

یک سری داده (کروموزوم) باینری داریم، میخوایم فقط کروموزوم هایی رو که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همی 1 نیست رو انتخاب کنیم.

ضمن تشکر از آقای انصاری، کدی رو که زحمت کشیدید و نوشتید جواب داد ولی متاسفانه من اصلا متوجه نشدم چکار میکنه.

داده دسیمال من اعدادی بین صفر تا هشته. اول این داده های دسیمال رو به باینری تبدیل کردم. بعد تو یه حلقه گذاشتم. به نظرم اشتباه اومد!

اینم کدش:

 

Pop=xlsread('ِSolar-Data.xls');

Pop1=dec2bin(Pop);

[NPar,NGene]= size(Pop1)

 

for I=1:NPar

for J=1:NGene

if Pop1(1)~=Pop1(NGene)~=1 && Pop(J)~=Pop(J+1)

Pop=BinaryData(I);

end

end

end

 

 

 

می خواستم کد آقای انصاری رو هم تغییر بدم و دیتای خودمو توش بذارم که نتونستم.

 

A = (0:255)';

Bin_A_cell = arrayfun(@(x) bitget(x,8:-1:1),A,'Un',0);

Bin_A = cell2mat(Bin_A_cell);

 

idx1 = ~any(Bin_A(:,1:7) .* Bin_A(:,2:8),2);

idx2 = Bin_A(:,1)~= 0 & Bin_A(:,8)~= 0;

 

[A(idx1 & idx2) Bin_A(idx1 & idx2,:)]

 

سلام

 

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

 

اما کد دوم رو هم بذارین توضیح بدم، A یه ماتریس ستونی از اعداد 0 تا 255 هست، می خوایم ببینیم چند تا از این اعداد چنین خواصی دارن، خب اول باید باینری اون ها بدست بیاریم، bin2dec رشته میده توی خروجی ولی bitget عدد معمولی میده راحت تر میشه باهاش کار کرد. خب مثلا عدد 19 رو می خوایم باینری 8 بیتی رو بدست بیاریم:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

خب حالا اگه یه آرایه ای داشته باشیم بخوایم یه فانکشنی رو روی همه ی درایه ها اجرا کنیم (اینجا bitget) می تونیم به جای حلقه از arrayfun استفاده کنیم همین کار رو می کنه. حالا ما چون برای هر درایه ی ماتریس، 8 تا درایه (برای هر بیت یه دونه) داشته باشیم، متلب این پیش فرض رو داره شاید همه هم اندازه نشن و نتونه توی یه ماتریس بذاره. پس بهش بگیم که اعداد صفر و یک هر درایه مون رو داخل یه سلول از یه متغیر از نوع cell array بذاره، اینکار رو با پارامتر 'UniformOutput' (البته دو حرف اول هم کفایت می کنه) رو روی false یا همون صفر قرار میدیم. بعدش ما که می دونیم همه ی سلول ها 8 تا درایه دارن پس توی ماتریس می تونن قرار بگیرن، با cell2mat تبدیل به ماتریسش می کنیم. حالا یه ماتریس 256 در 8 داریم، یعنی هر ستون این ماتریس معادل یه بیت از تمام عددهامون هست.

 

اینکه دو بیت کنار هم رو می خوایم ببینیم یک هست یا نه، هر بیتی رو در کناریش ضرب می کنیم، هفت بیت اول Bin_A(:,1:7) رو در هفت بیت دوم Bin_A(:,2:8) ضرب کردیم. اگه هر دو یک باشن یک میشه ضربشون دیگه، درسته. پس توی هر سطر ما هفت ستون داریم که نتیجه ی ضرب هر بیت در بیت کناریش هست. از بین این هفتا یه دونه هم یک باشه کافیه، پس میگیم توی هر سری اگه یه یک بود، ما اون عدد رو نمی خوایم، نتیجه صفر باشه. متلب یه فانکشن به نام any داره، اگه یه مقدار غیر یک داشته باشه خروجی یک هست، حالا ما هم اینجا ازش استفاده می کنیم. برای هر سط اگه یه یک داشته باشیم any به ما یک میده، خب ما اینا رو که نمی خوایم، اونایی که یک ندارن رو می خوایم، پس notش می کنیم (~). دیگه می خواستیم چی رو چک کنیم، بیت اول و بیت آخر، اینم برای کل اعداد چک می کنیم (من چرا نوشتم صفر نباشه، می تونستم همون یک باشه رو بنویسم)، در نهایت خروجی مون هم باید هم ویژگی idx1 رو داشته باشه و هم ویژگی idx2، اینا رو با هم and می کنیم. میشه ایندکس عدد هایی که می خوایم.

:a030:

لینک به دیدگاه

مجددا سلام

من دو روزه درگیر اینم که برای اعداد اعشاری چکار کنم

آقای انصاری تو یکی از پستاشون اینو جواب داده بودن

اما خروجی این کد کاراکتر هست و نمیتونه ورودی کد بالا باشه

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه
مجددا سلام

من دو روزه درگیر اینم که برای اعداد اعشاری چکار کنم

آقای انصاری تو یکی از پستاشون اینو جواب داده بودن

اما خروجی این کد کاراکتر هست و نمیتونه ورودی کد بالا باشه

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

 

سلام

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

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

شما چجوری می خواین عدد ها به باینری تبدیل بشن؟

لینک به دیدگاه
سلام

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

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

شما چجوری می خواین عدد ها به باینری تبدیل بشن؟

 

 

 

 

 

برام فرق نمیکنه چجوری باشه. فقط تو مقاله نوشته اعداد باید باینری باشن

این کدی که گذاشتید خروجیش صفره

لینک به دیدگاه
برام فرق نمیکنه چجوری باشه. فقط تو مقاله نوشته اعداد باید باینری باشن

این کدی که گذاشتید خروجیش صفره

 

خب اینا عدد اعشاری هست، نگفته به چه صورت به باینری تبدیل کنین؟

به خاطر این صفر میده، چون فکر کنم تعداد بیت ها رو زیاد گرفتم، بیت با ارزش صفر بشه.

 

گفتم نمی دونم این روشی که میگم درسته یا نه. این معادل باینری به نظر خودتون باید چجوری باشه؟

لینک به دیدگاه

خیلی سرچ کردم ولی چیزی پیدا نکردم

 

 

3 خط اول قسمت 2.1.1 مقاله در این رابطه صحبت کرده ولی مطلب خاصی نگفته!

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه
  • 3 هفته بعد...

سلام

عید همه مبارک باشه ان شاءالله

میخوام مدل کار رو تغییر بدم.

 

یه عدد باینری رندوم دارم مثلا به طول 100.

می خوام ببینم از چند تا سکانس تشکیل شده.

 

سکانس: قسمت هایی از عدد باینریمون که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همیشون 1 نیست.

 

چکار کنم؟

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه
سلام

عید همه مبارک باشه ان شاءالله

میخوام مدل کار رو تغییر بدم.

 

یه عدد باینری رندوم دارم مثلا به طول 100.

می خوام ببینم از چند تا سکانس تشکیل شده.

 

سکانس: قسمت هایی از عدد باینریمون که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همیشون 1 نیست.

 

چکار کنم؟

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

سلام

نوشتن کدش سخت نیست.

این عدد باینری رو از همون اعداد اعشاری تون تولید می کنین، حواستون به دقت ممیز شناور که توی محاسبات متلب ازش استفاده می کنه هست، همین فرمت double رو میگم، حدود 16 یا 17 تا از ارقام با ارزش عدد معتبر هستن و رقم های بعد اون رقم های اصلی عددتون نیستن. بیشتر منظورم اینه اگه در عددی ضرب می کنین، اینا رو در نظر بگیرین که عدداتون اشتباه نشن.

 

 

این کد کاری که می خواین رو انجام میده، میاد طول هر کدوم از این سکانس هاتون رو حساب می کنه، بعد این ماتریس طول رو به mat2cell میده تا هر سکانسی رو داخل یکی از cell ها قرار بده:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه

سلام

 

متشکرم آقا ایمان

متاسفانه این کد، خروجی مورد نظر رو نمیده!

من یه کد دیگه نوشتم

به نظرم منطقش صحیحه

ولی خطا میده!!!

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه

بذارید یک مثال بزنم.

 

مثلا این کروموزوم رو داریم: 000110001010011100010000

 

سکانس ها: سه تا صفر اول رو رد میکنیم تا به اولین 1 برسیم چون قراره ابتدا و انتهای هر سکانس، 1 باشه.

اولین 1 رو که دیدیم چک میکنیم که عدد بعدیش 1 هست یا نه، اگر 1 بود باز میریم بیت بعدی چون دو تا 1 کنار هم نباید باشه.

پس میرسیم به بیت پنجم که 1 هست و بیت بعدش هم صفره، حالا اینقدر جلو میریم که به اولین 1 بعدی برسیم. اولین

سکانس میشه: 10001

سکانس های بعدی: 1001

10001

 

اون سه صفر آخر هم که بی استفاده میشن.

لینک به دیدگاه
سلام

 

متشکرم آقا ایمان

متاسفانه این کد، خروجی مورد نظر رو نمیده!

من یه کد دیگه نوشتم

به نظرم منطقش صحیحه

ولی خطا میده!!!

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

بذارید یک مثال بزنم.

 

مثلا این کروموزوم رو داریم: 000110001010011100010000

 

سکانس ها: سه تا صفر اول رو رد میکنیم تا به اولین 1 برسیم چون قراره ابتدا و انتهای هر سکانس، 1 باشه.

اولین 1 رو که دیدیم چک میکنیم که عدد بعدیش 1 هست یا نه، اگر 1 بود باز میریم بیت بعدی چون دو تا 1 کنار هم نباید باشه.

پس میرسیم به بیت پنجم که 1 هست و بیت بعدش هم صفره، حالا اینقدر جلو میریم که به اولین 1 بعدی برسیم. اولین

سکانس میشه: 10001

سکانس های بعدی: 1001

10001

 

اون سه صفر آخر هم که بی استفاده میشن.

 

سلام

ببخشید، درسته من اصلا حواسم به قسمت اولش نبود.

 

کدی که خودتون نوشتین، متغیر j رو که تعریف نکردین، chromosome یه جا با c رو کوچیک نوشتین. این واسه ارورش، ولی for اینجا جواب نمیده، باید while استفاده کنین. اگه string هم هست فکر کنم می تونین از regexp هم استفاده کنین، جالب تر میشه.

 

فکر کنم این دیگه درست باشه:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه

متشکرم

 

بله متوجه خطاش شدم ولی خروجی کد من هم مثل مال شماست

مثلا تو این کروموزوم: 1001001100 سکانس ها رو به این صورت داریم: 1001000100

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

این کد من هم همین خطا رو داره. اونم به این دلیله که تو دستورا میگم اگه 2تا 1 کنار هم بودن، یکی به i اضافه کن و چون آرایه م یه ماتریس zero هست

وقتی i یکی میره جلو، به جاش صفر میاد. در حالی که اگه وقتی اولین بیت سکانس بود و دو تا 1 کنار هم بودند، باید اولی رو صفر کنیم و دومی رو در نظر بگیریم اما

وقتی به انتهای هر سکانس میرسیم، اگه دو تا 1 کنار هم بودن، باید برعکس باشه یعنب اولی 1 و دومی صفر بشه

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه
متشکرم

 

بله متوجه خطاش شدم ولی خروجی کد من هم مثل مال شماست

مثلا تو این کروموزوم: 1001001100 سکانس ها رو به این صورت داریم: 1001000100

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

این کد من هم همین خطا رو داره. اونم به این دلیله که تو دستورا میگم اگه 2تا 1 کنار هم بودن، یکی به i اضافه کن و چون آرایه م یه ماتریس zero هست

وقتی i یکی میره جلو، به جاش صفر میاد. در حالی که اگه وقتی اولین بیت سکانس بود و دو تا 1 کنار هم بودند، باید اولی رو صفر کنیم و دومی رو در نظر بگیریم اما

وقتی به انتهای هر سکانس میرسیم، اگه دو تا 1 کنار هم بودن، باید برعکس باشه یعنب اولی 1 و دومی صفر بشه

 

واسه من همون یه دونه رو میده دیگه:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

اینم خروجیش:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه

سوال بعد:

 

الان میخوام یه structure تولید کنم که یک قسمت position و یک cost داشته باشه. بعد این سکانس ها رو بریزم توی قسمت position ساختار.

در آخر هم cost سگمنت رو (مجموعه سکانس های یک کروموزوم) محاسبه کنم.

 

empty_individual{nSequence,1}.Position=[]

empty_individual{nSequence,1}.Cost=[]

 

وقتی اینطوری تعریف میکنم، میگه Cell contents assignment to a non-cell array object

لینک به دیدگاه
سوال بعد:

 

الان میخوام یه structure تولید کنم که یک قسمت position و یک cost داشته باشه. بعد این سکانس ها رو بریزم توی قسمت position ساختار.

در آخر هم cost سگمنت رو (مجموعه سکانس های یک کروموزوم) محاسبه کنم.

 

empty_individual{nSequence,1}.Position=[]

empty_individual{nSequence,1}.Cost=[]

 

وقتی اینطوری تعریف میکنم، میگه Cell contents assignment to a non-cell array object

 

 

واسه متغیرهای نوع struct که نمی تونین به صورت cell آدرس دهی کنین، موقعی که آخرین عدد یک بود ارور میداد:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه

باز هم مشکل

 

میخوام خروجی حلقه قبل رو با k-means کلاستر کنم. باید سکانس های هر کروموزوم یا pop جداگانه کلاستر بشه. چون خروجی از نوع structure هست، k-means قبولش نمیکنه.

بنابراین اول به سلول تبدیلش کردم و بعد به ماتریس که مشکلی پیش نیاد ولی خطا میده! میگه تغییر نوع ممکن نیست!

 

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • اضافه کردن...