How to apply a matlab code on a matrix if it already working on column vector.
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
M.S. Khan
am 5 Aug. 2019
Kommentiert: M.S. Khan
am 13 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.
2 Kommentare
Akzeptierte Antwort
Andrei Bobrov
am 12 Aug. 2019
Bearbeitet: Andrei Bobrov
am 12 Aug. 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));
Weitere Antworten (1)
Chidvi Modala
am 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
4 Kommentare
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!