/ / Créer une nouvelle matrice en combinant deux autres en utilisant une instruction if dans MATLAB - matlab, boucles, instruction if, matrice, remplacer

Créer une nouvelle matrice en combinant deux autres en utilisant une instruction if dans MATLAB - matlab, boucles, instruction if, matrice, remplacer

J'ai une matrice en dimension 8x6. La moitié des éléments de cette matrice sont 0, ce qui est très bien. Maintenant, je voudrais faire référence à une autre matrice qui est 160x6. La matrice 8x6 est basée sur la matrice 160x6 et résulte d'une fenêtre roulante (20 observations).

Je voudrais créer une nouvelle matrice (encore 160x6). Lorsqu'un élément de ma matrice 8x6 est égal à 0, j'aimerais que les 20 observations de la matrice 160x6 d'origine faisant référence à cet élément (étant 0) soient également à 0.

J'ai essayé ce qui suit:

for t=1:T
for i=1:N
if B(:,i) == 0;
C(t,i) = 0;
else
C(t,i) = A(t,i);
end
end
end

où j'ai:

A étant la matrice 160x6

B étant la matrice 8x6

C étant la nouvelle sortie en matrice 160x6

Pour le moment, j'obtiens une "nouvelle" matrice 160x6 (C), mais il reproduit exactement la matrice 160x6 d’origine (A). Donc, le bouclage ou l'instruction if est incorrect.

Réponses:

1 pour la réponse № 1

Vérifiez les éléments suivants:

%Initialize A matrix with ones for testing.
A = ones(160, 6);
B = ones(8, 6);

%Put few zeros in B
B(1:2:end,1) = 0;
B(5:3:end,3) = 0;

T = 160;
N = 6;

for t=1:T
for i=1:N
%The formula k = floor((t-1)/20)+1 equals 1, 1, 1, 1... 20 times, then 2, 2, 2, 2... 20 times
k = floor((t-1)/20)+1;
if B(k,i) == 0;
C(t,i) = 0;
else
C(t,i) = A(t,i);
end
end
end

%Display C as an image (for testing).
figure;imagesc(C);colormap gray

Image pour le résultat du test:
entrer la description de l'image ici


Les valeurs de k sont illustrées dans le graphique suivant:

T=160;t = 1:T;k = floor((t-1)/20)+1;figure;plot(t, k, "x");grid on;

entrer la description de l'image ici


La solution la plus compacte que j'ai pu réaliser:

C = A.*imresize((B ~= 0), size(A), "nearest");

2 pour la réponse № 2

Je vais donner un petit exemple basé sur ma compréhension de votre problème.

>> B = randi(10,8,6) - 5; % Sample B matrix

B =

-4     0    -4     4     5     1
-2     3     3     1     3    -4
-1     3     1    -3     1     4
2     5     0    -2     0     4
-3     4     5     4    -4     3
3    -1     2    -4     2    -3
-3     2     2     0    -4     2
2    -3     4    -3    -4     1

Dans cette matrice, vous voulez identifier les emplacements qui ont 0 par exemple. (1,2), (4,3), (4,5). et dans la matrice 160 x 6 (1: 20,2), (61: 80,3), (61: 80,5) devrait être égal à zéro. Vous pouvez utiliser le repelem fonction pour obtenir de tels index.

>> zeroIdx = repelem(B == 0,20,1)

zeroIdx contiendrait true si B est égal à zéro, chaque ligne étant répétée vingt fois.

>> C = A
>> C(zeroIdx) = 0 % Assign 0 to C using zeroIdx