View Full Version : یک سوال
mkkamrani
شنبه 17 مرداد 1394, 11:12 صبح
سلام
برای یک ماتریس 4*922267 که ستون دوم محصولات و ستون سوم دسته محصولات می باشد. چطور می توان برای هر محصول محصولات مشابه را با توجه به دسته هر محصول مشخص کرد؟
ممنون
rahnema1
شنبه 17 مرداد 1394, 22:34 عصر
سلام
می تونید داده ها را بر اساس ستون سوم sort کنید
mkkamrani
یک شنبه 18 مرداد 1394, 11:44 صبح
سلام
می تونید داده ها را بر اساس ستون سوم sort کنید
منظورم اینه که به طور مثال در ستون دوم برای محصول 1 محصولات مشابه با محصول 1 مثل 3 4 5 7 8 مشخص بشند. چطور میشه این کار رو با sort انجام داد؟
134056
rahnema1
یک شنبه 18 مرداد 1394, 16:31 عصر
فرض کنید اسم ماتریس شما a باشه ابتدا با توجه به برنامه موجود در این لینک (http://stackoverflow.com/questions/15159206/grouping-matrix-rows-in-terms-of-one-column) ماتریس b را می سازیم
a = [1 1 3 2;
1 2 2 2;
1 3 3 2;
1 4 3 5;
1 5 3 3;
1 6 11 4;
1 7 3 1;
1 8 3 4];
b = accumarray(a(:,3), a(:,2), [],@(x){x}, {});
سپس مثلا بخواهیم عناصر هم گروه با عنصر 1 را پیدا کنیم به صورت زیر می نویسیم
setdiff(b{a(1, 3)}, 1)
یا مثلا برای عنصر ششم:
setdiff(b{a(6, 3)}, 6)
mkkamrani
دوشنبه 19 مرداد 1394, 21:57 عصر
فرض کنید اسم ماتریس شما a باشه ابتدا با توجه به برنامه موجود در این لینک (http://stackoverflow.com/questions/15159206/grouping-matrix-rows-in-terms-of-one-column) ماتریس b را می سازیم
a = [1 1 3 2;
1 2 2 2;
1 3 3 2;
1 4 3 5;
1 5 3 3;
1 6 11 4;
1 7 3 1;
1 8 3 4];
b = accumarray(a(:,3), a(:,2), [],@(x){x}, {});
سپس مثلا بخواهیم عناصر هم گروه با عنصر 1 را پیدا کنیم به صورت زیر می نویسیم
setdiff(b{a(1, 3)}, 1)
یا مثلا برای عنصر ششم:
setdiff(b{a(6, 3)}, 6)
ممنون از پاسختون
برای اجرای این الگوریتم در حلقه 1 تا 296277 نیاز به زمان بسیار زیادی هست. چطور میشه این زمانو کوتاه کرد؟
c=zeros(8306,1);
for i=1:296277;
c=setdiff(b{rating(i, 3)}, i);
end
rahnema1
چهارشنبه 21 مرداد 1394, 07:09 صبح
این را امتحان کنید یه کم بهتر می شه
for i = 1:296277;
c = b{rating(i, 3)};
c(find(c == i, 1))=[];
end
mkkamrani
چهارشنبه 21 مرداد 1394, 09:18 صبح
این را امتحان کنید یه کم بهتر می شه
for i = 1:296277;
c = b{rating(i, 3)};
c(find(c == i, 1))=[];
end
ممنون :تشویق: زمان اجرا از 1500 ثانیه به 200 ثانیه رسید. به نظر شما نمیشه زمان اجرا باز هم کمتر کرد.
mkkamrani
چهارشنبه 21 مرداد 1394, 11:11 صبح
فرض کنید اسم ماتریس شما a باشه ابتدا با توجه به برنامه موجود در این لینک (http://stackoverflow.com/questions/15159206/grouping-matrix-rows-in-terms-of-one-column) ماتریس b را می سازیم
a = [1 1 3 2;
1 2 2 2;
1 3 3 2;
1 4 3 5;
1 5 3 3;
1 6 11 4;
1 7 3 1;
1 8 3 4];
b = accumarray(a(:,3), a(:,2), [],@(x){x}, {});
سپس مثلا بخواهیم عناصر هم گروه با عنصر 1 را پیدا کنیم به صورت زیر می نویسیم
setdiff(b{a(1, 3)}, 1)
یا مثلا برای عنصر ششم:
setdiff(b{a(6, 3)}, 6)
در هر سلول b مقادیر یکسانی وجود داره. چطوره میشه مقادیر را یکتا کرد؟
rahnema1
چهارشنبه 21 مرداد 1394, 11:36 صبح
در هر سلول b مقادیر یکسانی وجود داره. چطوره میشه مقادیر را یکتا کرد؟
اگه در هر سلول b مقادیر یکسان باشند نشون دهنده اینه که در ستون دوم مقادیر تکراری داریم
rahnema1
چهارشنبه 21 مرداد 1394, 11:38 صبح
ممنون :تشویق: زمان اجرا از 1500 ثانیه به 200 ثانیه رسید. به نظر شما نمیشه زمان اجرا باز هم کمتر کرد.
شاید بشه یه ذره کمتر کرد ولی فکر کنم چشمگیر نیست
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.