Passare un elemento di una vettore ad una funzione
Salve,
sto cercando, con qualche difficoltà, di convertire un programma da Mathlab al c++. Ho un problema con il passare un elemento di un vettore ad una funzione. La mia funzione $Residuo$ ha bisogno di un valore del vettore $x$ ,x, per poter calcolare il valore da me voluto. Ho capito che in C++ si deve passare il valore dell'indirizzo di memoria dell'elemento del vettore e non direttamente il valore del vettore, tuttavia non sono troppo esperto con i puntatori e mi continua a dare errore. Come potrei fare? Grazie
sto cercando, con qualche difficoltà, di convertire un programma da Mathlab al c++. Ho un problema con il passare un elemento di un vettore ad una funzione. La mia funzione $Residuo$ ha bisogno di un valore del vettore $x$ ,x, per poter calcolare il valore da me voluto. Ho capito che in C++ si deve passare il valore dell'indirizzo di memoria dell'elemento del vettore e non direttamente il valore del vettore, tuttavia non sono troppo esperto con i puntatori e mi continua a dare errore. Come potrei fare? Grazie
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
//Variabili da rappresentare
float yN, J, dy;
int N = 1000;
//Intervallo di rappresentazione
float Inizio = 0;
float Fine = 10;
float dx = (Fine-Inizio) / N;
// Per l'equazione
float ValIniziale = 0;
//Tolleranza per Newton
double toll = 1e-7;
vector<float> x(float Inizio, float Fine, float dx) {
vector<double> vet;
while (Inizio <= Fine) {
vet.push_back(Inizio);
Inizio += dx;
}
}
float Residuo(float y, float yN, float* x) {
y = yN - y + dx*(cos(x)*y - exp(-sin(x)));
return y;
}
float Jacobiano(float* x) {
J = 1 - dx*cos(x);
return J;
}
float y = ValIniziale;
int main() {
for (int i = 0; i <= N; i++) {
float res = 0;
while (res < toll) {
//Ciclo di Newton
res = Residuo(y, yN, x[i]);
dy = -res / Jacobiano(x[i]);
yN = dy + y;
cout << dy << endl;
}
y = yN;
cout << "Ciclo " << i << endl;
}
}
Risposte
Quale sarebbe il codice matlab che vorresti convertire? Non ho ancora iniziato a dare una occhiata al codice ma immagino possa essere utile come riferimento.
Il C++ non supporta alcuna operazione su matrici o array. Pure operazioni come copiare i valori da un vettore ad un altro vanno scritti per ogni elemento a meno di usare funzioni apposite. Certamente non è possibile applicare funzioni come cos, sin, exp.. su un intero array per esempio. Non è neanche possibile sommare un singolo valore con un array o due array insieme. Infine, quando si passa un array ad una funzione come puntatore, questo perde la sua dimensione che va quindi passata come argomento aggiuntivo.
A meno di usare una qualche libreria matematica la conversione è insomma molto più complicata che trasferire le operazioni da un linguaggio all'altro in modo meccanico.
A meno di usare una qualche libreria matematica la conversione è insomma molto più complicata che trasferire le operazioni da un linguaggio all'altro in modo meccanico.
Me ne sono reso conto, ieri con non poca fatica sono riuscito a convertire il codice. Adesso però ho un altro problema quello della divisione del codice per generalizzarlo. Voglio creare più sotto-funzioni che vengano richiamate di volta in volta dal programma principale, così se voglio cambiare l'equazione differenziale basta che cambio le sotto-funzioni e non il main. Il problema è che anche in questo caso non ho capito come fare. Il mio intento è fare una cosa di questo tipo.
Funzione principale: Main, che contiene:
Funzione per: Ciclo per Newton, che contiene:
Funzione per: Residuo + Jacobiano
e così via.
Avete una guida sintetica che spiega come farlo?
Propongo questo esempio banalissimo:
Il file prova modulare fornisce la somma di due valori x e y:
primo: passa il primo valore;
secondo:passa il secondo valore;
funzione: somma primo+secondo;
Provamodulare:stampa a schermo;
I file che ho scritto sono:
Provamodulare
funzione.cpp:
primo.cpp
secondo.cpp
funzione.h:
Quando lo compilo mi restituisce errore dicendo che non trova il file funzione.h. Ho prestato attenzione a mettere tutto nelle cartelle giuste....
Grazie
Funzione principale: Main, che contiene:
Funzione per: Ciclo per Newton, che contiene:
Funzione per: Residuo + Jacobiano
e così via.
Avete una guida sintetica che spiega come farlo?
Propongo questo esempio banalissimo:
Il file prova modulare fornisce la somma di due valori x e y:
primo: passa il primo valore;
secondo:passa il secondo valore;
funzione: somma primo+secondo;
Provamodulare:stampa a schermo;
I file che ho scritto sono:
Provamodulare
#include "stdafx.h"
#include <iostream>
#include <funzione.h>
using namespace std;
int x = 2;
int y = 1;
int main()
{
cout << funzione(int x, int y) << endl;
return 0;
}
funzione.cpp:
int funzione(int x, int y) {
return secondo(int x) + primo(int y);
}primo.cpp
#include <iostream>
using namespace std;
int primo(int x) {
return x;
}secondo.cpp
int secondo(int y) {
return y;
}funzione.h:
#ifndef FUNZIONE_H #define FUNZIONE_H void funzione(int x, int y); #endif
Quando lo compilo mi restituisce errore dicendo che non trova il file funzione.h. Ho prestato attenzione a mettere tutto nelle cartelle giuste....
Grazie
Non ho capito che cosa tu stia cercando di fare.. Il codice che hai scritto non ha senso ed è quindi normale che ti fornisca diversi errori. L'errore nella riga su funzione.h è legato alla decisione di usare <> per i file di sistema e "" per i file locali.
Per chiamare una funzione non devi poi inserire i tipi dei valori come se la stessi dichiarando. Devi semplicemente inserire gli argomenti alla funzione come faresti in matlab. Quindi il file provamodulare potrebbe avere semplicemente la forma:
Tuttavia questa funzione richiamerebbe la funzione con valori 2 e 1, che non è quello che credo tu voglia fare. Sbaglio? Discorso simile vale per le funzioni primo e secondo quando vengono usare in funzione.cpp.. Devono essere chiamate nel modo seguente (non sono al contrario primo e secondo?):
Ho inserito i prototipi delle due funzioni in modo che tu potessi usarle (puoi anche inserire i prototipi in file header che poi dovrai includere).
Ma qual'è il tuo obiettivo finale? Perché convertire tutto in C++ quando potresti continuare ad andare avanti in Matlab?
Per chiamare una funzione non devi poi inserire i tipi dei valori come se la stessi dichiarando. Devi semplicemente inserire gli argomenti alla funzione come faresti in matlab. Quindi il file provamodulare potrebbe avere semplicemente la forma:
#include <iostream>
#include "funzione.h"
int x = 2;
int y = 1;
int main()
{
std::cout << funzione(x, y) << std::endl;
return 0;
}
Tuttavia questa funzione richiamerebbe la funzione con valori 2 e 1, che non è quello che credo tu voglia fare. Sbaglio? Discorso simile vale per le funzioni primo e secondo quando vengono usare in funzione.cpp.. Devono essere chiamate nel modo seguente (non sono al contrario primo e secondo?):
int primo(int x);
int secondo(int y);
int funzione(int x, int y)
{
return secondo(x) + primo(y);
}
Ho inserito i prototipi delle due funzioni in modo che tu potessi usarle (puoi anche inserire i prototipi in file header che poi dovrai includere).
Ma qual'è il tuo obiettivo finale? Perché convertire tutto in C++ quando potresti continuare ad andare avanti in Matlab?
Grazie per la risposta.
Alla fine ho deciso di continuare con Matlab, il C lo dovrei imparare da 0.
Alla fine ho deciso di continuare con Matlab, il C lo dovrei imparare da 0.