Challenging Question - Finding mean of specific values of matrix and re-entering

Have tried countless times but need help
Writing script which has matrix M and returns a new Matrix where each element of N is the corresponding element of M averaged with its next elements above, below and left and right.
The script must work for any sized square matrix!

답변 (4개)

Fonctionne pour n'importe quel noyau K de taille 3 (facile à passer à une taille quelconque) et matrice M de taille quelconque :
M = [1 2 3; 4 5 6; 7 7 9];
K = [0 1 0;1 1 1;0 1 0];
Y = conv2(padarray(M,[1 1]),K,'same');
OK = conv2(padarray(ones(size(M)),[1 1]),K,'same');
Y = Y(2:end-1,2:end-1)./OK(2:end-1,2:end-1)
Hey Karan,
Sound very easy and typical!
It's nothing but programming and defining some conditions. you need 2 for loops for 2 dimension matrix, one to check for vertical neighbors and one for horizontal neighbors.
Once you're finding the neighbors in for loops you should check not to exceed matrix x or y dimension, and also not getting below 1, there is no index 0 in matlab (C C++ has index 0)
and neighbor definition is the current index - and + 1 as you know.
Find them correctly, add them and put them in a new matrix using the current index.
Oh, BTW, to get the matrix dimension you can use size
size(M,1) or size(M,2) whichever you need!
see MATLAB documentation for size
doc size
Good Luck!
Andrei Bobrov
Andrei Bobrov 2014년 8월 27일
편집: Andrei Bobrov 2014년 8월 27일
s = size(M);
l = true(s);
l(2:end-1,2:end-1) = false;
l1([1,s(1),numel(M)-[s(1)-1,0]]) = true;
l1 = reshape(l1,s);
l2 = l & ~l1;
N = conv2(M,[0 1 0;1 1 1;0 1 0]/5,'same'); % N = imfilter(M,[0 1 0;1 1 1;0 1 0]/5);
N(l1) = N(l1)*5/3;
N(l2) = N(l2)*5/4;
stalin
stalin 2014년 8월 27일
편집: Randy Souza 2014년 8월 28일
clear all
A=[1 2 3 4;5 6 7 8; 9 10 11 12; 13 14 15 16]
[l m]=size(A)
for i=1:l
for j=1:m
if i==1&&j==1
B(i,j)=(A(i,j)+A(i+1,j)+A(i,j+1))/3
elseif i==1&&j==m
B(i,j)=(A(i,j)+A(i+1,j)+A(i,j-1))/3
elseif i==l&&j==1
B(i,j)=(A(i,j)+A(i-1,j)+A(i,j+1))/3
elseif i==l&&j==m
B(i,j)=(A(i,j)+A(i-1,j)+A(i,j-1))/3
elseif i==1
B(i,j)=(A(i,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))/4
elseif i==l
B(i,j)=(A(i,j)+A(i,j+1)+A(i,j-1)+A(i-1,j))/4
elseif j==1
B(i,j)=(A(i,j)+A(i-1,j)+A(i+1,j)+A(i,j+1))/4
elseif j==m
B(i,j)=(A(i,j)+A(i+1,j)+A(i-1,j)+A(i,j-1))/4
else
% B(i,j)=0
B(i,j)= (A(i,j)+A(i-1,j)+A(i,j+1)+A(i+1,j)+A(i,j-1))/5
end
end
end

카테고리

도움말 센터File Exchange에서 Creating and Concatenating Matrices에 대해 자세히 알아보기

제품

태그

질문:

2014년 8월 27일

댓글:

2014년 8월 28일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by