PDA

View Full Version : مشکل در اجرای کد متلب



hamidkor
جمعه 15 فروردین 1393, 06:16 صبح
باسلام،

دوستان عزیز بنده از کد زیر رو واسه تفکیک یک ماتریس به دو ماتریس استفاده کرده ام، که واسه مثالی با داده های کم جواب میده اما واسه ابعاد بالا نمیتونم جواب بگیرم! اما تفکیک ماتریس b بدینصورت است که مولفه هایی از b که با مولفه های a برابر باشند رو جدا میکنه و مابقی رو تو یه ماتریس جداگونه قرار میده.
a=[1 2 3;4 5 6;7 8 9];
b=[1 2 3;4 5 6;7 8 9;10 11 12];
[~, ~, ib] = intersect(a(:,end),b(:,end));
final = b(ib,:);
r = b(setdiff(1:size(b),ib),:);

ماتریس های حاصل:
final =

1 2 3
4 5 6
7 8 9


r =

10 11 12
اما واسه داده هایی با ابعاد بالا مثل یه میلیون در 3 جوابی نمیده و ماتریس باقیمانده یا همان (r) دقیقا همان ماتریس اولیه ی b رو میده و واسه final اصن عضوی قرار نمیده و تهی بدست میاد!!!!! از نقطه نظرات شما دوستان گرامی خوشحال خواهم شد؟

rahnema1
شنبه 16 فروردین 1393, 12:35 عصر
سلام
اگه می خواهید ببینید عضو اون یکی هست می تونید از ismember استفاده کنید

a=[1 2 3;4 5 6;7 8 9];
b=[1 2 3;4 5 6;7 8 9;10 11 12];
ib=ismember(b,a);
final=b(ib)
r=b(~ib);

hamidkor
شنبه 16 فروردین 1393, 23:08 عصر
سلام
اگه می خواهید ببینید عضو اون یکی هست می تونید از ismember استفاده کنید

a=[1 2 3;4 5 6;7 8 9];
b=[1 2 3;4 5 6;7 8 9;10 11 12];
ib=ismember(b,a);
final=b(ib)
r=b(~ib);


ممنون دوست عزیز، اگر تنها میخواستیم که بدونیم که عضو هست یا نه کد شما درسته ولی اگر به کد بالایی توجه کرده باشین علاوه براین که عضو بودن مطرحه، رعایت و حفظ چیدمان قبلی هم مهمه! بعبارت دیگه: این که هر عضو در همان ردیف و ستون متناظر قبلی قرار بگیره چه در فاینال و چه در باقیمانده! درضمن دوباره اگر بیشتر دقت بشه متوجه میشین که در دو ماتریس حاصل ما همه ی ستون های حاصل رو میخواییم. دراصل قضیه مقایسه رو سه ستون اول هر ماتریسه (تو الگوریتم اصلی مسئله، سه ستون مختصات های x y z هستند و هر ردیف نشانگر یه نقطه هستش) و اگر ماتریس ما علاوه بر این سه ستون یک یا چند ستون دیگه داشته باشه یعنی اینکه مشخصه یا مشخصات هر نقطه است و ما میخواهیم واسه هر نقطه مشخصه ی متناظر خودش رو نیز در ماتریس های حاصل داشته باشیم.
جدا از این مسائل مشکل نمیدونم چیه که نه تنها تو مثال کوچک بلکه تو مثال هایی با ابعاد بالا (هم ابعاد مثال اصلی ولی با داده های تصادفی) نیز خیلی دقیق و جالب جواب رو رو میکنه! داده ها رو تو اکسل چندین بار چک کردم و اصن به هیچ وجه مشکلی نداره و با توابع اکسل همین کار انجام میشه ولی تو متلب انگار نه انگار!

rahnema1
یک شنبه 17 فروردین 1393, 08:53 صبح
اگه واسه چند ستونه این جور میشه

ib=ismember(b,a,'rows');
final=b(ib,:);
r=b(~ib,:);

hamidkor
یک شنبه 17 فروردین 1393, 23:06 عصر
اگه واسه چند ستونه این جور میشه

ib=ismember(b,a,'rows');
final=b(ib,:);
r=b(~ib,:);


آره دقیقا همینطوره، با intersec و setdiff هم میشه به نتیجه مطلوب رسید و لی مشکل دیگه ای که گفتم مربوط به داده های خودمه گویا که فاینال رو خالی و r رو کل ماتریس b قرار میده انگار که اصن دو تا ماتریس تو هیچ عضوی مشترک نیستن! درحالی که بصورت گرافیکی و عددی با نرم افزاری ها دیگه و اکسل چک کردم و مشکلی نبود! حتی قبلا با متلب هم جواب گرفته بودم ولی الان نمیدونم چی شده که ... .