مشاهده پروژه ثبت پیشنهاد روی پروژه
سلام
یک سوال متلب دارم. کسی بتونه کمک من این مسئله رو حل کنه دوست دارم بلند مدت باهاش کار کنم.
من یک ماتریس دارم به اسم newarr با اعداد مختلف مثلا 100 عدد یا 10 عدد. هرچی خلاصه
ولی هر عدد یک گنجایش خاص داره مثلا گنجایش عدد 2 به مقدارم 0.5 هست. که میشه همون آرایه متناظر WofP توی کد من.
حالا یه ظرف دارم به اسم Sum_WofA که باید موجودیش هرچی هست به صورت مساوی بین اعداد newarr تقسیم بشه اما یه قانون خیلی مهم داره این تقسیم مساوری:
اونم اینکه متناسب با تکرار شون میگیرن، یعنی مثلا اگر توی newarr عدد شماره 5 یک بار تکرار شده و عدد 2، 10 مرتبه تکرار شده یعنی عدد 2 ده برابر میگیره نسبت به 5. البته اگر بتونه دیگه قاعدتا چون ممکنه گنجایش عدد 2 اصلا اونقد نباشه و هیچ عددی نمیتونه بیشتر از گنجایشش بگیره.
حالا من برای اینکه این داستان و مشکل رو حل کنم یه تریک زدم و اونم اینکه Sum_WofA رو تقسیم بری میانگین repeatability کردم که توی کد من counts اسمش. بعدش هم WofP رو تقسیم بر counts کردم. بعدش اونم Sum_WofA جدید رو به صورت مساوی بین نقاط تقسیم کردم و بعدش WofP ضرب کردم در counts اما یه ارور خیلی کوچیک کارم داره و نمیدونم چیه! کسی میتونه حل کنه ممنون میشم و انشالله همکاری بلند مدت خواهیم داشت. هزینه درخواستی رو بفرمایید
کد:
clear; clc; close all;
% Generate Random Numbers
numPoints=10;
newarr(:,1) = randi([1, 5], numPoints, 1);
Sum_WofA = 0.5;
WofP = rand(numPoints, 1);
WofP = WofP/sum(WofP);
% Get unique points and their occurrence counts
[uniquePoints, ~, idx] = unique(newarr);
counts = accumarray(idx, 1);
disp('Unique numbers in newarr and their occurrence counts:');
for i = 1:length(uniquePoints)
fprintf('Number: %d, Count: %d\n', uniquePoints(i), counts(i));
end
% store Weight of point in WofP_new to work with WofP_new
WofP_new = WofP;
%Scale down the agent weight
Sum_WofA_average = Sum_WofA/mean(counts);
% Scale down the sample points based on the repeatability
for cnt_u = 1:length(uniquePoints)
WofP_new(uniquePoints(cnt_u)) = WofP(uniquePoints(cnt_u)) / counts(cnt_u);
end
WofP_new_initial = WofP_new;
size_g_0_in = length(uniquePoints);
%order them from the minimum to maximum
[minarray_in, Index_min_in] = sort(WofP_new(uniquePoints));
%Define some parameters
Criterion_in = 0;
PrevWgt_in = 0;
% Sum_WofA_average should distribute equally between sample points
for count_s=1:length(uniquePoints)
CurWgt_in = minarray_in(count_s);
if Sum_WofA_average >= Criterion_in+((size_g_0_in - count_s + 1) * (CurWgt_in-PrevWgt_in))
Criterion_in=Criterion_in+((size_g_0_in -count_s + 1) * (CurWgt_in-PrevWgt_in));
PrevWgt_in = CurWgt_in;
else
break;
end
end
WofP_new(uniquePoints) = WofP_new(uniquePoints)-PrevWgt_in;
non_zero_length = length(find(WofP_new(uniquePoints) > 0));
if non_zero_length > 0
WofP_new (uniquePoints) = WofP_new(uniquePoints) - (Sum_WofA_average - Criterion_in) / non_zero_length;
else
% Handle the case where there are no non-zero values
WofP_new(uniquePoints) = WofP_new(uniquePoints);
end
WofP_new(WofP_new<0) = 0;
%Up to here we distributed the Sum_WofA_average to the sample points and I’m pretty sure it works fine
% because check_WofP_new is zero which make sense to us
%Check it works fine:
dist_wofp_new = sum(WofP_new_initial)-sum(WofP_new);
check_WofP_new = Sum_WofA_average - dist_wofp_new
% Now I want to Scaling back
for cnt_e = 1:length(uniquePoints)
WofP_new(uniquePoints(cnt_e)) = WofP_new(uniquePoints(cnt_e)) * counts(cnt_e);
end
% Final check is:
dist_wofp_new = sum(WofP_new_initial)-sum(WofP_new);
check_WofP_new_Final = (Sum_WofA_average * mean(count_s)) - dist_wofp_new
% If you code is correct check_WofP_new_Final should be zero, right? Because the weight transported is equal to Sum_WofA
مشاهده جزئیات پیشنهادهای این پروژه
گزارش تخلف
پروژه را با دوستان خود به اشتراک بگذارید