کلیدستان

نسخه‌ی کامل: یافتن مقادیر هر عنصر در یک ماتریس از روی ماتریسی دیگر
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
با سلام خدمت اساتید
بنده سوالی داشتم در مورد اینکه اگر دو ماتریس هم اندازه داشته باشیم و بخواهیم ماتریسی جدید از این دو ایجاد کنیم با این شرط
که اگر مثلا در ماتریس اول عدد 1 وجود داشت متناظر آن در ماتریس دوم برگردانده شود ، منظور از متناظر یعنی مقدار درایه
در ماتریس دوم دقیقا در همان سطر و ستون ماتریس اول که اعداد 1 در آن قرار دارند به مانند مثال ذیل :

کد:
A =

1 2 3
4 5 6
1 3 1

B =

100 200 300
400 500 600
100 200 400

C =

100 100 400

ماتریس C متشکل از اعداد ماتتریس B متناظر با عدد 1 در ماتریس A می باشند

با تشکر
سلام.
برای همان مثالی که گفتید، کدهای زیر را می نویسیم (قابل اجرا برای هر مثال دیگر) :

کد:
clear all;
close all;
clc;

A=[1 2 3; 4 5 6; 1 3 1]
B=[100 200 300; 400 500 600; 100 200 400]
number=1;

A_total=numel(A);
p=0;
for nn=1:A_total
    if (A(nn)==number)
        p=p+1;
        C(p)=B(nn);
    end
end
C

نتیجه اجرای کد متلب بالا :

کد:
A =

     1     2     3
     4     5     6
     1     3     1


B =

   100   200   300
   400   500   600
   100   200   400


C =

   100   100   400

دستور numel ، تعداد کل عنصرهای یک ماتریس را محاسبه می کند.
ممنون از راهنماییتون مشکلمو حل کرد 
فقط یه سوال داشتم   بنده کد زیر و نوشتم که تو اون
 Pixels یه ماتریس  200*145*145 است و b یه ماتریس 145*145 است

کد:
for k=1:16;

 for p=1:200

 a=Pixels(:,:,p);
 c=(a(b == k))';

 end
d(p,:)=c;
end

مشکل اینجاست که وقتی برنامه اجرا میشه فقط یک بار حلقه اجرا میشه و ماتریس d به درستی تشکیل میشه اما دیگه برنامه جلو نمیره و این خطا رو میده :

??? Subscripted assignment dimension mismatch.

در حقیقت خروجی باید 16 تا ماتریس مجزا باشه که تعداد سطراشون همه یکسان اما تعداد ستوناشون متفاوت .
با دستور eval هم سعی کردم اما نتونستم . 

 شرمنده اینقدر سوال می پرسم
من رشتم سنجش از دور و باید همه آنالیزهای تصویری رو با کدهای متلب بنویسم
ممنون اگر راهنمایی بفرمایید

 
خطای dimension mismatch زمانی ایجاد می شود که مثلا شما می خواهید مقادیر یک بردار را در بردار دیگری قرار دهید (با دستور A=B) ولی اندازه دو بردار برابر نیست. بنابراین این که در حلقه هستید، مهم نیست. بلکه دستورات درون حلقه را چک کنید و ببینید که اندازه بردار ها و ماتریس هایی که برابر هم قرار می دهید، چقدر است (با دستور size می توانید اندازه آنها را به دست آورید) و ببینید کدام خط از کدها را اشتباه نوشته اید. در خود خطا هم، شماره خط مربوط به خطا را می نویسد.
 
باسلام
خطاى برنامه مربوط به خط ششم مى باشد و دليل آن اين كه براى بار اول كه حلقه اجرا مى شود ماتريس d 
20 * 200 اما وقتى براى بار دوم حلقه اجرا ميشه ماتريس خروجى 26 * 200 كه اينجا خطا ميده
ماتريس هاى بعدى هم ابعادشون متفاوته
چه بايد كرد؟
معمولا ماتریس ها را با اندازه نهایی آنها، به وسیله دستور zeros ، تعریف می کنند و بعد به مرور، مقدار عناصر آنها را محاسبه کرده و در ماتریس قرار می دهند.
شاید این نکته به شما کمک کنه.