MATLAB Answers

My code on n consecutive elements in a matrix

14 views (last 30 days)
Qingchuan Lyu
Qingchuan Lyu on 11 Jul 2018
Edited: Matt J on 11 Jul 2018
Hi, I got a question to figure out the largest sum of n consecutive elements in a matrix. The order can be in the same row, column, diagonal, or reverse diagonal. Here is my code. However, the matlab keeps telling me variables "i","j", "u", "w","z" may be unused.Could you give me a hint how to make these variables valid? Also, I guess there is a way to simply my code a little bit? Thanks!
A numerical example would be: Suppose A=[1 2; 3 4] and n=2. We need to find the largest sum of 2 consecutive elements in all directions. In this case, we have
rows: 1+2, 3+4
columns: 1+3, 2+4
diagonal: 1+4
reverse diagonal: 2+3
Obviously, the output of this function should be 3+4. How could I write a function without loops? Any hint will be appreciated.
% function x=maxsum(A, n)
[p,q]=size(A);
k=zeros(1,q*floor(p/n));
%rows
for i =1:p
j=1:q-n+1;
u=1:q*floor(p/n);
k(u)=sum(A(i,j:j+n-1));
i=i+1;
j=j+1;
u=u+1;
end
K=max(k);
%columns
y=zeros(1,p*floor(q/n));
for w=1:q-n+1
v=1:q;
z=1:p*floor(q/n);
y(z)=sum(A(w:w+n-1, v);
w=w+1;
v=v+1;
z=z+1;
end
Y=max(y);
%diagonal
t=zeros(1,p-n+1);
for h=1:p-n+1
B=A(h:h+n-1,h:h+n-1);
t(h)=diag(B);
h=h+1;
end
T=max(t);
%reverse diagonal
m=zeros(1,p-n+1);
for o=1:p-n+1
c=flip(A(o:o+n-1,o:o+n-1));
m(o)=diag(c);
o=o+1;
end
M=max(m);
%compare all
x=max([M T Y K]);
% end

  3 Comments

Shantanu Gontia
Shantanu Gontia on 11 Jul 2018
You are changing the looping variable inside the loop itself. In a MATLAB for, you need not increment the looping variable inside the loop, it is done automatically.
In addition, you have written j=1:q-n+1; and also, k(u)=sum(A(i,j:j+n-1));. This is inconsistent as j is a vector.
KSSV
KSSV on 11 Jul 2018
Your loop index is replaced with same variable inside loop. This is not good code. YOu need to rethink. Give us a numerical example with data, you will get help and this task can be achieved without loop.
Qingchuan Lyu
Qingchuan Lyu on 11 Jul 2018
@KSSV A numerical example would be: Suppose A=[1 2; 3 4] and n=2. We need to find the largest sum of 2 consecutive elements in all directions. In this case, we have
rows: 1+2, 3+4
columns: 1+3, 2+4
diagonal: 1+4
reverse diagonal: 2+3
Obviously, the output of this function should be 3+4. How could I write a function without loops? Any hint will be appreciated.

Sign in to comment.

Accepted Answer

Matt J
Matt J on 11 Jul 2018
Edited: Matt J on 11 Jul 2018
To avoid loops, use convolution. For example
forwardDiags = conv2(yourMatrix,eye(3),'valid')
will compute all forward diagonal sums of length 3. Similarly,
reverseDiags = conv2(yourMatrix,fliplr(eye(3)),'valid')
will compute reverse diagonals, and so on.

  0 Comments

Sign in to comment.

More Answers (0)

Sign in to answer this question.

Tags

Products


Release

R2017b