ورود

View Full Version : جستجوی عناصر یک آرایه در آرایه ای دیگر در متلب



firethumbs
دوشنبه 28 دی 1394, 19:17 عصر
دوستان سلام

من یک آرایه ی cell دارم که می خوام عناصر اون را در آرایه ای دیگر جستجو کنم و تعدادش را در آرایه ای جدید بطول آرایه ای اول ذخیره کنم
مثلا




dd = {'a' , 'aa' , 'aaaa' , 'b' , 'c' , 'd' , 'dd' , 'ee' , 'x'}
tt = { 'a' 'a' 'aa' 'aaaa' 'b' 'c' 'aa' 'd' 'ee' 'aa' }




dd آرایه ی اولم هستش که میخوام تعداد تک تک عناصر اون را در آرایه ی tt بدست بیاروم
و چیزی که انتظار دارم اینه:


[2,3,1,1,1,1,0,1,0]


از لطفتون خیلی سپاسگزارم

aqm176
دوشنبه 28 دی 1394, 20:01 عصر
سلام.
کدش رو میخواید یا نه روشش رو؟

aqm176
دوشنبه 28 دی 1394, 20:13 عصر
روشش بدین صورت هستش که:
به ترتیب عناصر آرایه اولی رو در دومی جستجو میکنید
ینی ابتدا 1 را از آرایه dd گرفته، و سپس تا انتهای آرایه بعدی میروید تا پیدا کند.
زمانی که پیدا کرد ایندکس را بر میگرداند که کار راحتی است.

ثابت زمانیه این الگوریتم: N^2

rahnema1
دوشنبه 28 دی 1394, 20:17 عصر
سلام
توی متلب لازمه از حلقه ها تا می تونیم استفاده نکنیم
با روش زیر order الگوریتم n خواهد بود

dd = {'a' , 'aa' , 'aaaa' , 'b' , 'c' , 'd' , 'dd' , 'ee' , 'x'};
tt = { 'a' 'a' 'aa' 'aaaa' 'b' 'c' 'aa' 'd' 'ee' 'aa' };

n= numel(dd);
dic = cell2struct(num2cell(zeros(n, 1)), dd, 1);
for word = tt
if isfield(dic , word)
dic.(word) = dic.(word) + 1;
end
end

cell2mat(struct2cell(dic))'

firethumbs
سه شنبه 29 دی 1394, 06:29 صبح
سلام
از لطف دوستان ممنون هستم. اما من الگوریتم متلبی می خواستم.
این چیزی که من میخوام را در یه سایت خارجی جستجو کردم و کدش دوخط بیشتر نیست ولی درست جواب نمیده. اون دو خط را اینجا میزارم. یعنی این 8 خط کدی که دوستمون لطف کردند را با این دوخط خلاصه می کنند بدون استفاده از حلقه و شرط منتها یه اشکال کوچک داره که کار منو راه نمی اندازه.




[uniqueres, ~, J]=unique(res2);
occ = histc(J, 1:numel(uniqueres));




از دوستان خواهش میکنم اگه نظری دارند راهنمایی کنند.
باتشکر

rahnema1
سه شنبه 29 دی 1394, 06:36 صبح
ببینید این برنامه ای که شما گذاشتید روی داده های عددی می تونه کار کنه یعنی دستور histc مخصوص ماتریس یا بردار عددی هست اما چون ما سلول رشته ای داریم مجبوریم از یه طریق دیگه عمل کنیم که فکر کنم این روشی که گذاشتم نسبت به روشهای دیگه کم هزینه تر باشه

firethumbs
سه شنبه 29 دی 1394, 06:38 صبح
از توجهتون ممنون.
من سعی میکنم از کدتون توی برنامه استفاده کنم. منتها اگه که روش کم هزینه تری پیدا کردید ممنون میشم برام ارسال کنید.

از بقیه دوستان هم خواهش میکنم روش بهتری پیدا کردند دریغ نکنند
باتشکر

rahnema1
سه شنبه 29 دی 1394, 13:39 عصر
الان که فکرش کردم دیدم می شه از hist هم با ترفند روی رشته ها هم استفاده کنیم مثل کد شما البته شرطش اینه که اعضای dd یکتا و مرتب شده باشند

words = [dd , tt];
[~, ~, j] = unique(words);
h = hist(j, 1:numel(dd)) - 1

امید1359
دوشنبه 30 فروردین 1395, 06:41 صبح
الان که فکرش کردم دیدم می شه از hist هم با ترفند روی رشته ها هم استفاده کنیم مثل کد شما البته شرطش اینه که اعضای dd یکتا و مرتب شده باشند

words = [dd , tt];
[~, ~, j] = unique(words);
h = hist(j, 1:numel(dd)) - 1


سلام کد زیر شاید بهتر جواب بده نیازی به مرتب شدن نداره ولی می شه بفرمایی برای چی می خوای این کدو
words = {'abba' 'bed' 'carrot' 'damage' 'bed' , 'bed' , '\a\\'};
[unique_words, ~, occurrences] = unique(words);
unique_words
unique_counts = hist(occurrences, 1:max(occurrences))