je ne pouvais pas la dernière partie de mes recherches, donc si quelqu'un pouvait me aider je serais vraiment apprécié pour l'aide .. :)S'il vous plaît aidez-moi à tester mon hypothèse avec les éléments voisins dans la matrice
dire que ma matrice d'origine est,
X =
0 0 0 0 0
0 0 12 9 0
0 4 9 15 0
0 11 19 0 0
0 2 4 8 0
0 4 5 8 0
0 0 0 0 0
et après avoir constaté la moyenne des non-zéros je vais obtenir quelque chose comme ci-dessous:
new_x =
0 0 0 0 0
0 0 **9.0000** 9.0000 0
0 4.0000 9.0000 **9.0000** 0
0 **8.3333** **8.0000** 0 0
0 2.0000 4.0000 8.0000 0
0 4.0000 5.0000 8.0000 0
0 0 0 0 0
Notez que tous les éléments qui sont plus e un 10 est le 'centre' et nous voulons trouver la moyenne des non-zéros avec le rayon de dis 1 m. où 1 mètre = 1 élément éloigné du centre.
** ** signifie le centre.
Pour cette partie, je l'ai utilisé les éléments suivants (de gnovice):
X=[0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0;
0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0];
kernel=[0 1 0; 1 0 1; 0 1 0];
sumx=conv2(X,kernel,'same');
nx=conv2(double(X>0),kernel,'same');
index=(X>10);
new_x=X;
new_x(index)=sumx(index)./max(nx(index),1);
Alors ma question est que je veux comparer les éléments voisins avec son centre si elles sont égales, moins, ou plus grand. Si elle est supérieure ou égale à '1' ou bien '0'. De plus, tous les éléments extérieurs au rayon peuvent être ignorés et remplacés par '0'.
Par exemple, le 9
dans le milieu est dans le rayon de 12, 15 et 19 centres, afin de prendre le centre minimum de ceux `min [9,000, 9,000, 8,000] = 8,000. Dans ce cas, 4 ne prendra pas en considération car il ne s'appelle pas le 'centre' ainsi que [8 4 5 et 8] dans les deux dernières rangées.
Je veux quelque chose comme ci-dessous:
Test_x =
0 0 0 0 0
0 0 1 1 0
0 0 1 1 0
0 1 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
J'ai mis cette première partie dans le forum avant et je suis vraiment apprécié pour toutes les suggestions plus tôt.
Donnez-moi quelques idées pour commencer. J'ai essayé d'utiliser une boucle mais cela n'a pas semblé fonctionner très bien. N'importe quelle fonction de MATLAB qui peut faire le travail pour moi ..
Merci beaucoup pour l'aide.
Débutant à Matlab
Je pense avoir trouvé la solution à cette question en utilisant des techniques Jonas.Nous vous remercions de l'aide Jonas et gnovie :)
X = [0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0; 0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0];
kernel = [0 1 0; 1 0 1; 0 1 0];
sumx = conv2 (X, noyau, 'même');
nx = conv2 (double (X> 0), noyau, 'même');
avg_x = X;
avg_x (avg_x < 10) = 0;
indice = (avg_x> 10);
avg_x (index) = sumx (indice) ./ max (nx (indice), 1);
avg_x =
0 0 0 0 0
0 0 9.0000 0 0
0 0 0 9.0000 0
0 8.3333 8.0000 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
tmp_x = avg_x;
maxVal = max (avg_x (:)) + 1;
tmp_x (tmp_x == 0) = maxVal;
tmp_x = imerode (tmp_x, noyau);
Test_x = X> = tmp_x;
Je ne comprends pas ce que vous essayez de faire. Pour chaque élément, prenez-vous le minimum des voisins non-zéro, puis voyez si l'élément est supérieur ou égal à cette valeur? Considérant l'élément avec la valeur 9 près du centre dans votre exemple, pourquoi ne pas prendre le minimum de '[4 9 9 8]', ce qui serait 4? – gnovice
Pour la valeur 9, je ne prends pas 4 dans ma considération parce que 4 n'est pas le centre ou la moyenne des nonzeros. Le but est de comparer les voisins avec leurs centres, donc quels que soient les éléments qui sont en dehors du rayon, vous pouvez les ignorer et les remplacer par '0'. Merci encore. – Nadhris