Change the first group of 0s in each column

4 ビュー (過去 30 日間)
Ana Maria Alzate
Ana Maria Alzate 2021 年 5 月 19 日
回答済み: Matt J 2021 年 5 月 19 日
I have this matrix, there are more than 500 columns and 30 rows.
I need to change only the first group of 0s into 3. The 0s in the end, after the 1s, should stay as 0s.

回答 (2 件)

Mathieu NOE
Mathieu NOE 2021 年 5 月 19 日
hello Ana
here my suggestion , based on a dummy data array ; i kept the NaN unchanged (my assumption)
Code is :
clc
clearvars
A = [NaN 0 0 0 ;...
0 NaN NaN 0;...
NaN 0 NaN NaN;...
1 0 0 0 ;...
1 2 2 0 ;...
0 2 1 0 ;...
0 1 3 0]
%% main code
A2 = A;
A2(isnan(A2)) = 0;
As = sum(A2,2);
ind_row = find(As<eps);
B = A(ind_row,:);
B(B<eps) = 3;
A(ind_row,:) = B
gives foloowing output :
initial A array :
A = NaN 0 0 0
0 NaN NaN 0
NaN 0 NaN NaN
1 0 0 0
1 2 2 0
0 2 1 0
0 1 3 0
modified A array (output) :
A = NaN 3 3 3
3 NaN NaN 3
NaN 3 NaN NaN
1 0 0 0
1 2 2 0
0 2 1 0
0 1 3 0
  6 件のコメント
Ana Maria Alzate
Ana Maria Alzate 2021 年 5 月 19 日
Yes, the size is different because I just got an screenshot for the first image.
Mathieu NOE
Mathieu NOE 2021 年 5 月 19 日
ok this seems to be the right data file....
Updated my code, and as far as I can tell, seems to fullfill your request ...
load('STN.mat')
A = STN_1;
tmp = A(1:30,1:10)
%% main code
for ci = 1:size(A,2)
AA = A(:,ci);
if max(AA)>eps % if yes, this column must be updated for the first zeros (up to first 2)
ind = find(abs(AA-2)<eps); % find rows that contains "2"
ind = ind(1);
B = AA(1:ind-1,:);
B(B<eps) = 3;
AA(1:ind-1,:) = B; % replace 0 with 3
A(:,ci) = AA;
end
end
tmp2 = A(1:30,1:10)
initial A array :
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 0
0 0 2 2 0 0 0 0 0 2
2 2 2 2 0 0 0 0 2 2
2 2 2 2 0 0 0 0 2 2
2 2 2 2 0 0 0 0 2 2
2 2 2 2 0 0 0 0 2 2
2 2 2 2 2 2 0 0 2 2
1 2 1 1 2 2 0 0 2 1
1 1 1 1 1 2 0 0 1 1
1 1 1 1 0 1 0 0 1 1
1 1 1 1 0 1 0 0 1 NaN
1 1 1 1 0 1 0 0 1 1
0 1 1 0 0 0 0 0 1 1
0 1 1 0 0 NaN NaN NaN NaN NaN
0 0 0 0 0 NaN NaN NaN NaN NaN
0 0 0 0 0 NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
modified A array (output) :
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 3 0 0 3 3
3 3 3 3 3 3 0 0 3 3
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN 3 0 0 3 3
3 3 3 3 3 3 0 0 3 3
3 3 3 3 3 3 0 0 3 3
3 3 3 3 3 3 0 0 3 3
3 3 2 3 3 3 0 0 3 3
3 3 2 2 3 3 0 0 3 2
2 2 2 2 3 3 0 0 2 2
2 2 2 2 3 3 0 0 2 2
2 2 2 2 3 3 0 0 2 2
2 2 2 2 3 3 0 0 2 2
2 2 2 2 2 2 0 0 2 2
1 2 1 1 2 2 0 0 2 1
1 1 1 1 1 2 0 0 1 1
1 1 1 1 0 1 0 0 1 1
1 1 1 1 0 1 0 0 1 NaN
1 1 1 1 0 1 0 0 1 1
0 1 1 0 0 0 0 0 1 1
0 1 1 0 0 NaN NaN NaN NaN NaN
0 0 0 0 0 NaN NaN NaN NaN NaN
0 0 0 0 0 NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

サインインしてコメントする。


Matt J
Matt J 2021 年 5 月 19 日
c=cumsum(A,1,'omitnan');
A(c==0 & A==0)=3;

カテゴリ

Help Center および File ExchangeData Type Conversion についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by