Comment ne du voisin le plus proche d'interpolation de travail dans MATLAB?
Je veux savoir comment interpolation du plus proche voisin travaille dans MATLAB. J'ai des données d'entrée :
A = [1 4 7 4 3 6] % 6 digit vector
- Je utiliser le code MATLAB suivant :
B = imresize(A,[1 9],'nearest');
J'obtiens le résultat suivant :
[1,4,4,7,4,4,3,6,6]
La résolution à la main, j'obtiens ce résultat :
[1 4 4 7 4 4 3 3 6]
Pouvez-vous svp me guider? Vais-je mal quelque part?
OriginalL'auteur semantic_c0d3r | 2013-09-20
Vous devez vous connecter pour publier un commentaire.
Si vous appliquez régulièrement interpolation à l'aide de
interp1
, il vous donnera le résultat que vous calculée par la main:Il y a quelques temps, je suis allé à travers le code source de IMRESIZE essayer de comprendre comment il fonctionne. Voir ce post pour un résumé. À un certain point, le code fait appel à un privé MEX-fonction (pas de code source disponible), mais les commentaires sont assez pour comprendre la mise en œuvre.
Pour ce que ça vaut, il y a une aussi une fonction
imresize_old
qui fournit un ancien de la mise en œuvre deimresize
(utilisé dans la version R2006b et antérieures). Il a donné encore un autre résultat différent:Ce qui est plus il a été observé précédemment que la mise en œuvre entre MATLAB et Octave diffèrent aussi dans certains cas.
EDIT:
Comme vous l'avez remarqué, dans certains cas, vous devez être attentif à virgule flottante limitations lorsque vous travaillez avec
interp1
. Nous avons donc pu faire l'interpolation en choisissant x-numéros entre[0,1]
gamme, ou une plus grande stabilité de gamme comme[1,numel(A)]
. En raison des erreurs d'arrondi dans les cas limites, cela pourrait donner des résultats différents.Par exemple de comparer les deux codes ci-dessous:
contre:
Voici la sortie joliment mis en forme:
De sorte que vous pouvez voir que certains numéros ne sont pas exactement représentable en double précision lorsque l'on travaille dans [0,1]. Afin de 0,3, ce qui est supposé être dans le milieu de [0.2, 0.4], s'avère être plus proche de l'extrémité inférieure de 0,2 inférieure à 0,4 en raison de l'erreur d'arrondi. Tandis que de l'autre côté, 2.5 est exactement dans le milieu de [2,3] (tous les chiffres exactement représenté), et est affecté à l'extrémité supérieure de 3 à l'aide du voisin le plus proche.
Aussi être conscient que
colon
etlinspace
peut produire différentes sorties parfois:Essayez-la. Il est intéressant de noter MATLAB et Octave ont donné des résultats différents pour N=11 à l'aide de
interp1
: ideone.com/TMP1bRJ'ai ajouté une section sur les erreurs en virgule flottante, voir mon edit au dessus
OriginalL'auteur Amro
NN est la forme la plus simple d'interpolation. Il a la recette suivante: l'utilisation de la valeur à l'échantillon le plus proche de l'emplacement. La NN de l'interpolation dans MATLAB calcul efficace, mais si vous avez besoin de plus de précision, je vous recommande d'utiliser le bilinéaire ou l'interpolation bicubique. Vous pouvez aussi vérifier interp1() à la place.
Ici fournit une explication avec un exemple: http://www.mathworks.com/help/vision/ug/interpolation-methods.html
OriginalL'auteur
Je n'ai pas de référence pour le présent, aussi je vous conseille de le tester contre d'autres exemples utilisant
imresize
mais je peux récupérer Mat;ab valeurs de ce type.Supposer que
A
représentey
les valeurs et les positions des éléments dansA
représententx
valeurs. alors maintenant,maintenant, nous devons trouver d'interpolation de la position c'est à dire
xi
points. J'aurais fait comme ceci:qui donne
ce qui résulte en une
yi
dequi diffère à la fois de vous et Matlab réponses (comment avez-vous le vôtre?)
Alors j'ai essayé:
qui fait juste comme beaucoup de sens et me met à Matlab résultat de
Donc je suppose que c'est comment ils le font. Mais je n'ai pas
imresize
pour tester d'autres casOriginalL'auteur Dan