PDA

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 ثانیه رسید. به نظر شما نمیشه زمان اجرا باز هم کمتر کرد.

شاید بشه یه ذره کمتر کرد ولی فکر کنم چشمگیر نیست