Creating index and replacing values

4 vues (au cours des 30 derniers jours)
Inna Pelloso
Inna Pelloso le 21 Juin 2021
Commenté : Inna Pelloso le 21 Juin 2021
Hi,
I have A = [0 0 1 0 1 0 0], and B = [ "030121", "030221", "030321"]
I want to create C = [ "030121", "030121", "030221", "030221", "030321", "030321", "030321"], by looking at A, and treating each sucessive sequence beginning with 1 as a new day, and replacing with the corresponding date from B. his is a generalization of a large problem.
Any help would be appreciated!
Inna
  2 commentaires
Scott MacKenzie
Scott MacKenzie le 21 Juin 2021
Note that
B = [ '030121', '030221', '030321']
is the same as
B = '030121030221030321'
and that
C = [ '030121', '030121', '030221', '030221', '030321', '030321', '030321']
is the same as
C = '030121030121030221030221030321030321030321'
Did you perhaps intend these to be strings, for example
B = ["030121", "030221", "030321"]
Inna Pelloso
Inna Pelloso le 21 Juin 2021
Correction made. I intended them to be strings.

Connectez-vous pour commenter.

Réponse acceptée

Steven Lord
Steven Lord le 21 Juin 2021
A = [0 0 1 0 1 0 0];
B = [ "030121", "030221", "030321"];
I'm going to assume that A does not start with 1, or if it does that indicates the first element of the result should be the second element in B.
C = 1 + cumsum(A)
C = 1×7
1 1 2 2 3 3 3
D = B(C)
D = 1×7 string array
"030121" "030121" "030221" "030221" "030321" "030321" "030321"
Alternately if you're doing this to build a datetime array:
D2 = datetime(2021, 3, C)
D2 = 1×7 datetime array
01-Mar-2021 01-Mar-2021 02-Mar-2021 02-Mar-2021 03-Mar-2021 03-Mar-2021 03-Mar-2021
D2.Format = 'MMddyy'
D2 = 1×7 datetime array
030121 030121 030221 030221 030321 030321 030321
  2 commentaires
Inna Pelloso
Inna Pelloso le 21 Juin 2021
Elegant solution!
Scott MacKenzie
Scott MacKenzie le 21 Juin 2021
@Steven Lord Hmm, cumsum. Yes, that's way to do this. Thanks.

Connectez-vous pour commenter.

Plus de réponses (1)

Scott MacKenzie
Scott MacKenzie le 21 Juin 2021
Below is a loop solution. There might be a way to vectorize this -- not sure.
A = [0 0 1 0 1 0 0];
B = [ "030121", "030221", "030321"];
M = [];
k = 1;
for i=1:length(A)
if A(i) == 1 % new day
k = k + 1;
end
M = [M B(k)];
end
Output:
M =
1×7 string array
"030121" "030121" "030221" "030221" "030321" "030321" "030321"
Obviously, the number of 1s in A can't exceed the number of strings in B (minus 1).
  1 commentaire
Inna Pelloso
Inna Pelloso le 21 Juin 2021
appreciate the help! Cumsum is rather elegant!

Connectez-vous pour commenter.

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by