Asked by M.S. Khan
on 5 Aug 2019

MM = [3 3 3; 3 3 3; 0 0 0;0 0 0;3 3 3;3 3 3;0 0 0;0 0 0;0 0 0;3 3 0;0 3 3;0 0 3;3 0 0;3 3 0;3 3 3;0 0 0; 0 0 0;3 3 3;0 0 0];

i want to get output matrix in this shape:

output=[3 3 3;3 3 3;3 3 3;3 3 3 ;3 3 3;3 3 3;4 4 4;4 4 4;4 4 4;3 3 4;4 3 3;4 4 3;3 4 4;3 3 4;3 3 3;3 3 3;3 3 3;3 3 3;0 0 0];

% --------------------------------------------------------------

% This coding is working nicely on a column vector M.

% How to apply it on a matrix MM as given above.

%--------------------------------------------------------------

M =[3,3,0,0,3,3,0,0,0,3,3,0,0,3,3,0,0,3,0]';

m = M;

m(m == 0) = nan;

%lo - define the indices of the values that need to be changed:

lo = fillmissing(m,'previous') == 3 & fillmissing(m,'next') == 3 & isnan(m);

% ii - assign numbers to intervals:

ii = cumsum([0;diff(lo)>0]).*lo;

%{

p - count the amount of each value of vector ii:

1 element - the number of zeros (0's);

2 element the number of values in the first interval.

3 element the number of values in the second interval, etc.:

%}

p = accumarray(ii(:)+1,1);

% Let a - the values for to be changed (vector with length equal max(ii), in our case - 4):

a = [3,4,4,3]'; % HERE fixed..

% Condition for intervals with length equal 1

a(p == 1) = 3;

% Replacement:

M(lo) = a(ii(lo));

Thanks for all cooperation.

Very thankful for support in advance.

Answer by Andrei Bobrov
on 12 Aug 2019

Edited by Andrei Bobrov
on 12 Aug 2019

Accepted Answer

[r,c] = size(MM);

m = MM;

m(m == 0) = nan;

%lo -define the indices of the values that need to be changed:

lo = fillmissing(m,'previous') == 3...

& fillmissing(m,'next') == 3 & isnan(m);

% ii - assign numbers to intervals:

ii = cumsum([zeros(1,c);diff(lo)>0]).*lo;

%{

p - count the amount of each value of vector ii:

1 element - the number of zeros (0's);

2 element the number of values in the first interval.

3 element the number of values in the second interval, etc.:

%}

[y,x] = ndgrid(1:r,1:c);

p = accumarray([ii(:)+1,x(:)],1);

p = p(2:end,:);

% Let a -the values for to be changed (vector for each column

% with length equal max(ii), in our case - 4):

a = repmat([3,4,4,3]',1,c);

% Condition for intervals with length equal 1

a(p == 1) = 3;

% Replacement:

MM(lo) = a(ii(lo));

Answer by Chidvi Modala
on 8 Aug 2019

I am assuming the length of vector MM is pxq

You can use the below code

for i=1:q

M=MM(:,i);

% insert your algorithm here

M(lo)=a(ii(lo));

MM(:,i)=M;

end

M.S. Khan
on 12 Aug 2019

I am assuming the length of vector MM is pxq What’s PXQ?

M.S. Khan
on 12 Aug 2019

for i=1:q ===> what will be the length of q?

M.S. Khan
on 12 Aug 2019

MM = [3 3 3; 3 3 3; 0 0 0;0 0 0;3 3 3;3 3 3;0 0 0;0 0 0;0 0 0;3 3 0;0 3 3;0 0 3;3 0 0;3 3 0;3 3 3;0 0 0; 0 0 0;3 3 3;0 0 0];

q = length(MM)

for i=1:q

M=MM(:,i);

m = M;

m(m == 0) = nan;

%lo - define the indices of the values that need to be changed:

lo = fillmissing(m,'previous') == 3 & fillmissing(m,'next') == 3 & isnan(m);

% ii - assign numbers to intervals:

ii = cumsum([0;diff(lo)>0]).*lo;

%{

p - count the amount of each value of vector ii:

1 element - the number of zeros (0's);

2 element the number of values in the first interval.

3 element the number of values in the second interval, etc.:

%}

p = accumarray(ii(:)+1,1);

% Let a - the values for to be changed (vector with length equal max(ii), in our case - 4):

a = [3,4,4,3]'; % HERE fixed..

% Condition for intervals with length equal 1

a(p == 1) = 3;

% Replacement:

M(lo) = a(ii(lo));

MM(:,i)=M;

end

% ----------------------------------- -----------------------

% the lenght of q is undefined.

first we should define the length of q. then we can use loop, right.

could you please explain. regards

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## KSSV (view profile)

## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/474842-how-to-apply-a-matlab-code-on-a-matrix-if-it-already-working-on-column-vector#comment_731862

## M.S. Khan (view profile)

## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/474842-how-to-apply-a-matlab-code-on-a-matrix-if-it-already-working-on-column-vector#comment_731863

Sign in to comment.