How to apply a matlab code on a matrix if it already working on column vector.

1 vue (au cours des 30 derniers jours)
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.
  2 commentaires
KSSV
KSSV le 5 Août 2019
What is the criteria to replace some zeros with 3 and others with 4?
M.S. Khan
M.S. Khan le 5 Août 2019
If we compare M and output matrix.
suppose its a column vector: [3 00 3 0003 0003 00030]' => [3 3 3 3 4 4 4 3 4 4 4 3 3 3 3 3 0]'
pattern of filling:
-- Between first and next 3, repalce 0s with 4
-- Beteeen next 3 and next coming 3, replace 0s with 4
-- next 3 and next coming 3, replace 0s with 3

Connectez-vous pour commenter.

Réponse acceptée

Andrei Bobrov
Andrei Bobrov le 12 Août 2019
Modifié(e) : Andrei Bobrov le 12 Août 2019
[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));
  1 commentaire
M.S. Khan
M.S. Khan le 13 Août 2019
Thanks Dr. Andrei Bobrov
Really you are great mind. Prayers and good wishes for you.
Warm Regards

Connectez-vous pour commenter.

Plus de réponses (1)

Chidvi Modala
Chidvi Modala le 8 Août 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
  4 commentaires
M.S. Khan
M.S. Khan le 12 Août 2019
for i=1:q ===> what will be the length of q?
M.S. Khan
M.S. Khan le 12 Août 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

Connectez-vous pour commenter.

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by