3 views (last 30 days)

So I have a matrix, let's say

A = [1 2;

1 0;

3 2;

0 1;

2 1;

1 2];

[r,c] = size(A);

In general, what I would like to do is:

for i = 1:r-1

x = A(6,1)*A(i,1) + A(6,2)*A(i,2);

end

However, here is the issue: if A(i,1) and/or A(i,2) is zero, and let's assume just A(i,1) is 0 and A(i,2) is non-zero, then, instead I would like to do:

x = A(6,1)*A(i-1,1) + A(6,2)*A(i,2);

And in case, even A(i-1,1) is also zero, then, I would like to do:

x = A(6,1)*A(i-2,1) + A(6,2)*A(i,2);

and so on and so forth (same for A(i,2)). Note, A(1,1), A(1,2), A(6,1), A(6,2) are always non-zeros. I am trying to get my head around it, but so far no luck, although it seems it should have a simple and efficient way.

Your help is highly appreciated. Please let me know if anything seems confusing.

Thanks in advance!

Stephen Cobeldick
on 19 Jun 2020

Edited: Stephen Cobeldick
on 19 Jun 2020

Try this reasonably "simple and efficient way":

r = size(A,1);

x = nan(r,1);

for k = 1:r

r1 = find(A(1:k,1),1,'last');

r2 = find(A(1:k,2),1,'last');

x(k) = A(6,1).*A(r1,1) + A(6,2).*A(r2,2);

end

Stephen Cobeldick
on 19 Jun 2020

'...generalizing it for "n" number of columns of A'

C = cumsum(A(:)~=0,1); % requires that first and last rows do not contain zeros!

B = nonzeros(A);

B = reshape(B(C),size(A));

x = sum(A(6,:).*B,2)

Personally I would just use a loop, as it makes the code intent much clearer.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/551014-a-complicated-matrix-manipulation#comment_904534

⋮## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/551014-a-complicated-matrix-manipulation#comment_904534

## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/551014-a-complicated-matrix-manipulation#comment_904537

⋮## Direct link to this comment

https://ww2.mathworks.cn/matlabcentral/answers/551014-a-complicated-matrix-manipulation#comment_904537

Sign in to comment.