Multiplication vecteur par un vecteur de vecteur

Fermé
sara.khenine Messages postés 1 Date d'inscription lundi 8 juillet 2013 Statut Membre Dernière intervention 8 juillet 2013 - 8 juil. 2013 à 15:32
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 - 13 juil. 2013 à 16:24
Bonjour,

j'ai un vecteur de vecteur. je veux multiplier chaque vecteur par un autre vecteur de perturbation. le problème c'est que mon code prend que le premier vecteur du vecteur et le multiplie avec toute les valeurs du vecteur de perturbation. donc je croix qu'il y a un problème au niveau du boucle. voici le code:
void test::perturberData()
{

float w=0.0;
vector<float> nombres;
float x;


for(int i=0;i<4;i++)
{

cout << "Entrez les valeurs du vecteur "<<endl;
cin >> x;
nombres.push_back(x);

}

for(int i=0;i<this->nb_parametres;i++)
{
for(int k=0;k<this->dataset.size();k++){
vector<float> colonnei=dataset->at(k);

for(int j=0;j<colonnei.size();j++){

w=nombres.at(i)*colonnei.at(j);

this->perturbativeData[data_pos].push_back(w);}
}}
}

1 réponse

mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
13 juil. 2013 à 16:24
Je n'ai pas compris ce que tu appelles un produit de vecteur. En admettant qu'il s'agisse d'un produit scalaire il suffit de définir une fonction qui calcule le produit scalaire de deux vecteurs :

#include <iostream>
#include <ostream>
#include <vector>

double produit_scalaire(
    const std::vector<double> & x,
    const std::vector<double> & y
){
    double res  = 0;
    size_t size = x.size();

    if (x.size() != y.size()) throw;

    for (size_t i = 0; i < size; ++i) {
        res += x[i] * y[i];
    }   
    
    return res;
}   

std::ostream & operator << (
    std::ostream & out,   
    const std::vector<double> & x
) {
    out << '[';
    for (size_t i = 0; i < x.size(); ++i) {
        out << ' ' << x[i];
    }
    out << " ]";
    return out;
}

int main() {
    std::vector<double> x, y;

    x.push_back(1);
    x.push_back(5);
    x.push_back(3);

    y.push_back(2);
    y.push_back(0);
    y.push_back(4);

    std::cout << "produit_scalaire(" << x << ", " << y << ") = " << produit_scalaire(x, y) << std::endl;
    return 0;
}


... ce qui donne :

produit_scalaire([ 1 5 3 ], [ 2 0 4 ]) = 14


Après tu peux dire que l'opérateur * sur deux vecteurs effectue un produit scalaire. Tant qu'à faire on peut même définir sur des vecteurs génériques.

// x * y <=> produit_scalaire(x, y);

template <typename T>
T operator * (
    const std::vector<T> & x,
    const std::vector<T> & y
) {
    T res;
    size_t size = x.size();

    if (x.size() != y.size()) throw;

    for (size_t i = 0; i < size; ++i) {
        res += x[i] * y[i];
    }   
    
    return res;
}


Bonne chance
0