11
votes

Tableaux de type MATLAB en C ++

Comment définir des tableaux en C ++ / Open CV comme je le fais dans Matlab?

Par exemple: P>

y=linspace(a,b,n);


1 commentaires

Bonne réponse à une question similaire ici .


8 Réponses :


3
votes

OpenCV offre certaines fonctions similaires à Matlab, mais leur nombre est très limité.

vous pouvez xxx

il prend également en charge diag ()

mais pour la plupart de cette fonctionnalité de MATLAB délicieuse comme < Code> linspace ou magie 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)


0 commentaires

3
votes

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.

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


0 commentaires

9
votes

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): xxx


3 commentaires

préallocation remplit tableau avec les valeurs n , puis push_back ajoute des valeurs n à 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 .


@mattattière, vous pouvez utiliser la fonction réserve pour être plus efficace.



1
votes

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;
}


0 commentaires

1
votes
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;

1 commentaires

Votre réponse doit contenir une explication de votre code et une description comment elle résout le problème.



1
votes

Voici mon espace de lins testé très similaire à tous les autres mais gère tous les cas: xxx


1 commentaires

Erreur classique de la division par zéro lorsque n = 1 ... J'ai posté de légers changements (voir ci-dessous)



0
votes

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;
}


2 commentaires

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 est de double et peut être + ve ou -ve.



1
votes

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)


0 commentaires