Comment définir des tableaux en C ++ / Open CV comme je le fais dans Matlab?
Par exemple: P>
y=linspace(a,b,n);
8 Réponses :
OpenCV offre certaines fonctions similaires à Matlab, mais leur nombre est très limité.
vous pouvez p> il prend également en charge mais pour la plupart de cette fonctionnalité de MATLAB délicieuse comme < Code> linspace code> ou diag () code> p> magie code> ou autre, il n'y a pas de correspondant à OpenCV, principalement parce que OpenCV n'est pas un package mathématique, mais une vision informatique une. Si vous avez besoin d'une fonction spécifique, vous pouvez le cloner dans votre projet (AKA l'écrire vous-même) P> p>
Malheureusement, C ++ n'a rien d'intégré pour permettre ce type d'initialisation de matrice. Il prend en charge des tableaux multidimensionnels, mais vous auriez besoin d'initialiser chaque élément vous-même. C ++ est un langage de niveau inférieur à celui de MATLAB et il s'agit beaucoup plus de travail pour écrire la fonctionnalité pour créer et initialiser une variable de type matricielle. p>
Après avoir dit qu'il existe un certain nombre de bibliothèques disponibles pour une utilisation avec C ++ qui facilitent le calcul numérique que si vous deviez tenter de l'écrire vous-même. Si vous devez envisager d'utiliser des bibliothèques, consultez ce lien qui suggère quelques-uns appropriés https://scicomp.stackexchange.com/questions/351/Recommendations-for-a-usable-fast-c-matrix-library P>
renvoie les réponses précédentes pour des réponses générales à votre question.
Spécifiquement, pour adresser les deux exemples que vous avez mentionnés, voici un code C ++ équivalent à l'aide de vecteurs pour générer de manière dynamique les tableaux que vous avez mentionnés (pas testés): p>
préallocation remplit tableau code> avec les valeurs n code>, puis push_back code> ajoute des valeurs n code> à la fin, vous devez donc laisser tomber le préallocation
Merci @yuppienetworking. J'étais déroutant des langues, pensant que le constructeur alloué sans remplissage. J'ai supprimé la préallocation, puisque utilise push_back code>.
@mattattière, vous pouvez utiliser la fonction réserve code> pour être plus efficace.
Ceci est une implémentation simple si vous utilisez OPENCV.
Mat linspace(double &startP,double &Endp,int &interval)
{
double spacing = interval-1;
Mat y(spacing,1,CV_64FC1);
for (int i = 0; i < y.rows; ++i)
{
y.at<double>(i) = startP + i*(Endp - startP)/spacing;
}
return y;
}
double* linspace(int xi, int xf, unsigned int n){
double *vec ;
vec = new double[n];
float esp, falt=xf-xi;
esp=falt/(n-1);
vec[0]=xi;
for(int i=1; i<n; i++)
vec[i]=vec[i-1]+esp;
return vec;
Votre réponse doit contenir une explication de votre code et une description comment elle résout le problème.
Voici mon espace de lins testé très similaire à tous les autres mais gère tous les cas:
Erreur classique de la division par zéro lorsque n = 1 code> ... J'ai posté de légers changements (voir ci-dessous)
Extension de la réponse de @ Gilad ci-dessus pour les cas lorsque n = 0 code> et n = 1 code> car ce dernier donne lieu à la division par zéro. vector<double> linspace(double a, double b, int n) {
vector<double> array;
if ((n == 0) || (n == 1) || (a == b))
array.push_back(b);
else if (n > 1) {
double step = (b - a) / (n - 1);
int count = 0;
while(count < n) {
array.push_back(a + count*step);
++count;
}
}
return array;
}
Votre code ne gère pas le cas lorsque l'étape est -ve. (B> A ou B
@Kankittie Qu'est-ce qui vous fait dire ça, avez-vous essayé le code?
étape code> est de double code> et peut être + ve ou -ve.
Je voudrais ajouter une légère modification au code proposé en matttement. Je l'ai utilisé et il y a des cas lorsque pas code> n'est pas calculé correctement en raison de l'approximation de la division while(a <= b+0.00001)
Bonne réponse à une question similaire ici .