PDA

View Full Version : تقسیم ماتریس به بلوک های سه در سه



com-daneshjo
دوشنبه 11 آبان 1394, 23:36 عصر
سلام
من میخاستم کاربر هر ماتریسی رو به عنوان ورودی داد بتونم به بلوک های سه در سه تقسیم کنم و قطر اصلی و قطر فرعی هر کدوم از این بلوک ها رو عوض کنم.می دونم که اول باید شرطی بذارم که بررسی کنه ماتریس ورودی تعداد سطر و ستونش مضربی از سه باشه و اینکه چطور میشه عناصر قطر اصلی و فرعی رو عوض کرد هم می دونم فقط مشکل من سر اینه که چطور میشه به بلوک های سه در سه تقسیم کرد و چطور عملیات رو روش انجام داد یعنی بریزم تو متغیر و عملیات رو انجام بدم یا همون جا انجام بدم ممنون میشم کمک کنید

rahnema1
سه شنبه 12 آبان 1394, 21:49 عصر
سلام
شما همون قدر که بلد هستید اینجا بنویسید تا بگیم چیکار کنید

com-daneshjo
چهارشنبه 13 آبان 1394, 19:57 عصر
سلام
شما همون قدر که بلد هستید اینجا بنویسید تا بگیم چیکار کنید

x=input('please enter x');
[n,m]=size(x);
if mod(n,3)~=0 | mod(m,3)~=0
x=input('please enter x')
a=n/3 b=m/3 t=a*b
من می دونم تی ناحیه دارم که هر کدوم یک بلوک سه در سه هست برای جابجایی عناصر قطر اصلی با فرعی تو یه ماتریس معمولی از این روش استفاده می کنم

for i=1:n
temp=x(i,i);
x(i,i)=x(i,n-i-1);
x(i,n-i-1)=temp;
end

حالا چظور اینکارو رو ی بلوک های مختلف این ماتریس انجام بدم؟:ناراحت::ناراحت:

rahnema1
چهارشنبه 13 آبان 1394, 20:07 عصر
ببینید مثلا می خواهیم یک بلوک 3x3 از یک ماتریس با بلوک 3x3 از ماتریس دیگه جابجا کنیم به صورت زیر:


A = rand(10);
B = rand(10);
A(3:5,2:4) = b(6:8,1:3)

حالا شما همین روش را داخل حلقه تودرتو انجام بدید یعنی دو تا for توی هم دیگه باشه
البته واسه جابجایی قطر اصلی و فرعی می تونید از همون روش که در مورد ایجاد علامت ضربدر قبلا گفته بودم استفاده کنید که دیگه هیچ حلقه for لازم نمیشه
در اینجا فعلا با حلقه انجام بدید تا یک روش را به شما بگم که نیاز به حلقه نداشته باشه

com-daneshjo
چهارشنبه 13 آبان 1394, 20:22 عصر
a=n/3 b=m/3 t=a*b
for i=1:a
for j=1:b
satr=i*3;
soton=j*3;
ssatr=satr-2;
ssoton=soton-2;
for k=ssatr:satr
for l=ssoton:soton
تعویض عناصر قطر اصلی و فرعی بلوک
end
end
end
end

com-daneshjo
چهارشنبه 13 آبان 1394, 20:35 عصر
ببینید مثلا می خواهیم یک بلوک 3x3 از یک ماتریس با بلوک 3x3 از ماتریس دیگه جابجا کنیم به صورت زیر:


A = rand(10);
B = rand(10);
A(3:5,2:4) = b(6:8,1:3)

حالا شما همین روش را داخل حلقه تودرتو انجام بدید یعنی دو تا for توی هم دیگه باشه
البته واسه جابجایی قطر اصلی و فرعی می تونید از همون روش که در مورد ایجاد علامت ضربدر قبلا گفته بودم استفاده کنید که دیگه هیچ حلقه for لازم نمیشه
در اینجا فعلا با حلقه انجام بدید تا یک روش را به شما بگم که نیاز به حلقه نداشته باشه

آخه باید یه رابطه بین قطر اصلی و فرعی پیدا کنم که تو تمام بلوک ها جواب بده بعد شروع کنم به جابجایی

com-daneshjo
چهارشنبه 13 آبان 1394, 20:49 عصر
x(1:2:3,1:2:3)=x(3:-2:1,3:-2:1)
یعنی مثلا این قطر اصلی و فرعی رو عوض میکنه؟مثل این برا ماتریسم بنویسم

rahnema1
چهارشنبه 13 آبان 1394, 21:04 عصر
این مبتنی بر روش شما و با یک حلقه هست:

for i=1:3:n-2
temp=x(i:i+2,i:i+2);
x(i:i+2,i:i+2)=x(i:i+2,n-i-1:n-i+1);
x(i:i+2,n-i-1:n-i+1)=temp;
end


بدون حلقه هم می شه نوشت

com-daneshjo
چهارشنبه 13 آبان 1394, 22:42 عصر
ممنون فهمیدم چطور باید حلش کنم:تشویق:

com-daneshjo
چهارشنبه 13 آبان 1394, 22:43 عصر
a=n/3 b=m/3 t=a*b
for i=1:a
for j=1:b
satr=i*3;
soton=j*3;
ssatr=satr-2;
ssoton=soton-2;
x(ssatr:2:satr,ssoton:2:soton)=x(satr:-2:ssatr,soton:-2:ssoton)
end
end
من اینطوری نوشتم