استفسار حول سبب عدم تحديث القيمه في for loop في الماتلاب؟؟!


(gem) #1

[SIZE=“4”][COLOR=“DarkOrchid”]مساء الخير جميعاً

لدي برنامج لحساب المتوسط برمجيا بدل من استخدام الدوال الجاهزه
وذلك بواسطة برنامج الماتلاب

المشكله ان قيمة المجموع لا تتحدث مع كل دوره ولا أعرف السبب
بالرغم من تأكدي من صحة الكود

وهذا الكود البرمجي:

[SIZE="4"]x=imread('G.jpg');
[M,N]=size(x);
L=M*N;
x1=reshape(x,1,L);
s=0;
for i=1:L
     s=s+x(i);
end
Avg=s./L[/size]

قيمة الـ S في الكود لا تساوي المجموع!!!؟؟؟
ارجو ممن لديه فكره أو يعرف السبب أن يوضح لي الموضوع

ولكم جزيل الشكر
(فرج الله هم من يرد علي ونفع بعلمه)

[/color][/size]


(غــلا) #2

مساء النور

فيه خطأ واضح
s
المفروض تجمعى عليها x1
لانها هى التى غيرنا حجمها
وان شاء الله يحل المشكله
اختك
غــلا “مبتدئه فى الماتلاب”

(gem) #3

[CENTER][SIZE=“4”]مشكووره ياغلا على المرور والرد
لكن
sorry

أنا غلطت في النقل

البرنامج هو:

[SIZE="4"][B]x=imread('G.jpg');
[M,N]=size(x);
L=M*N;
x1=reshape(x,1,L);
s=0;
for i=1:L
     s=s+x1(i);
end
Avg=s/L[/b][/size]

نفس الشئ عند التنفيذ يطلع ناتج avg=0

مع انه المفروض يطلع قيمه عديده

اش السبب؟؟[/size][/center]


(gem) #4

[SIZE=“5”][COLOR=“DarkOrchid”][B]معقوله ما أحد يعرف؟؟؟

عموما شكرا لكل من مر بدون أن يرد

[/b][/color][/size]


(غــلا) #5

اسفه gme لم استطع المساعده
انا ارى ان الكود سليم
و قد جربته على مصفوفه
واشتغل تمام
بس على الصوره ما رضى
ومثل ما انتى عارفه انا مبتدئه
بس انا عملت المتوسط بطريقه ثانيه من غير for
استخدمت داله sum


(gem) #6

[CENTER]

[SIZE=“5”][B][COLOR=“DarkOrchid”]مشكووووووره على الرد والاهتمام
الله يعطيك ألف عافيه ولا يحرمك الأجر

ننتظر انا وانت رد من أصحاب الخبره[/color][/b][/size][/center]


(عبد العزيز غالب) #7

[CENTER]السلام عليكم ورحمه الله وبركاته

اخي العزيز طريقه ال sum ماشيه اسموثلي من دون اي مشاكل ما ادري وايش حكايه ال for بس بحاول اشوفها في ما بعد ان شاء الله

وهذا الكود

USING SUM
x=imread(‘G.jpg’);
[M,N]=size(x);
L=M*N;
Y=reshape(x,1,L);
s=sum(Y);
Avg=s/L

[/center]


(عبد العزيز غالب) #8

السلام عليكم اخي لقد وجدت تفسير للمشكله وحل مبدئي لها وقد شدني الى ذلك الرقم 255 الذي يمثل اكبر قيمه يمكن ان يا خذها Unsigned 8-bit integer وعليه فان المات لاب وضعت الs على انه من هذا النوع فكان اكبر قيمه له هي 255 وعند قسمته على ال L الذي هو قيمه كبيره 1394811 فان النتيجه سوف تكون صغيره جدا جدا يتم تقريبها الى الصفر واذا حاولنا ان نعرف ال s على انه Unsigned 32-bit integer حيث بامكانه ان ياخذ قيمه كبيره فسوف تتم عمليه الfor بطريقه سليمه ويكون لدينا الناتج كالاتي

[SIZE=4][COLOR=red]

[/color][/size]
[CENTER][SIZE=4][COLOR=red]x=imread('G.jpg'); [/color][/size]
[SIZE=4][COLOR=red][M,N]=size(x);[/color][/size][/center]

[SIZE=4][COLOR=red][/color][/size][CENTER][SIZE=4][COLOR=red]L=M*N;[/color][/size]
[CENTER][SIZE=4][COLOR=red]x1=reshape(x,1,L);[/color][/size]
[SIZE=4][COLOR=red]s=uint32(0);[/color][/size]
[SIZE=4][COLOR=red]for i=1:L[/color][/size]
[SIZE=4][COLOR=red]   s=s+ uint32(x1(i));[/color][/size]
[SIZE=4][COLOR=red]end[/color][/size][/center]
[SIZE=4][COLOR=red] [/color][/size]
[CENTER][SIZE=4][COLOR=red]Avg=s/L[/color][/size][/center]
[/center]



(gem) #9

[CENTER][SIZE=“4”][COLOR=“DarkOrchid”]الله يعطيك ألف عافيه ويفرج همك وييسر لك أمورك

صراحه ماني عارفه كيف أشكرك على مساعدتك
ألف شكر أخي عبدالعزيز

لكن عندي استفسار بسيط
اذا كان الناتج مكون من عدد صحيح وجزء عشري كما هو مبين في الكود

>> for i=1:l
s=s+uint32(x1(i));
end
>> avg=s/l

avg =

         174

>> mean(x1)

ans =

  174.4175

>> 

مالذي أستطيع تغييره في قيمة uint32 حتى تظهر لي النتيجه كامله؟؟

لأنه لازم تتطابق النتائج

وانا جربت ان أضع 64 لكن يطلع لي error!!!ما الحل

أتمنى ما أكون أثقلت عليك بسؤالي[/color][/size][/center]


(عبد العزيز غالب) #10

السلام عليكم ورحمه الله وبركاته

اولا عدم وجود الرقم العشري يرجع الى نوع المتغير فهو interger يعني عدد صحييح وليس عشري ومهما كان كبير فلن تظهر الارقام بعد العلامه العشريه وعليه فيتم تغييره الى double or float التى يتم تمثيلها في الذاكره عشريا
ثانيا على حسب علمي والله اعلم ان 32 هو اكبر عدد يمكن تمثيله ك integer في الحاسبات اما في الماتلاب فانا شبه متاكد انه اكبر رقم ولايمكن ولو انظرنا الى هذا الشي من زاويه اخرى لوجدنا أن نظام التشغيل هو 32-bit (اعني الويندوز الذ نعمل عليه) مع انه قد لا تكون العلاقه مباشره فبلامكان تلافي هذا بالمشين سايكلز وتكوين رقم 32000000000000000000000-bit

ثالثا ال32-bit يكفي ويزيد لتمثيل الرقم الذي قد ينتج لدينا في برنامجنا هذا

على اي حال هذا هو الكود


 
[CENTER]x=imread('G.jpg'); 
[M,N]=size(x);
L=M*N;
x1=reshape(x,1,L);
s=double(0);
for i=1:L
s=s+ double(x1(i));
end
Avg=s/L[/center]

تحياتي


(المهندس سعود) #11

الحل الامثل هو الاخير
بعد ان تقرأ الصورة وتحولها الى مصفوفة
حولها الى double
ومن ثم اوجد المتوسط
وبعد ذلك ارجع حوله الى uint


(عبد العزيز غالب) #12


ولاكن اذا كنت سوف تحولها الى في النهايه الى uint فسوف يضيع ما بعد العلامه العشريه وعلى هذا لا داعي لاستخدام ال double من اصله
فالحل الاخير هو الامثل بدون تحويل

تحياتي

(gem) #13

[CENTER][CENTER][CENTER][CENTER]

[SIZE=“5”][COLOR=“DarkOrchid”][B]الله يجزاك الجنه يااارب

ويفرّج همّك ويرزقك من حيث لا تعلم،ونفع بعلمك،وكثر من أمثالك

جد أعجز عن شكرك أخوي عبدالعزيز

[/b][/color][/size]
[/center][/center][/center][/center]


(عبد العزيز غالب) #14

[CENTER]امين يا رب

ولك مثله

ولا شكر على واجب

تحياتي
[/center]


(المهندس سعود) #15

الله يجزيك الخير اخي عبدالعزيز
واهلا بك في المنتدى
نفخر بامثالك ومنكم نستفيد