Re: Matrisberäkningar med för STM32?
Postat: 25 januari 2019, 20:56:01
För annars kan jag inte ha min 2D array där.
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
void svd(matrix* a, matrix* u, matrix* s, matrix* v){
// Find data of matrix 'a'
int n = a->row;
int m = a->column;
matrix* t; // Temporary matrix
/*
* Initial declaration of values
*/
// Copy eye matrix to u
t = eye(n, n);
copyval(t, u);
freeMatrix(t);
// Copy transpose of 'a' to s
t = tran(a);
copyval(t, s);
freeMatrix(t);
// Copy eye matrix to v
t = eye(m, m);
copyval(t, v);
freeMatrix(t);
// Init q and r matrix for QR-facorization
matrix* q = initMatrix(n,m);
matrix* r = initMatrix(n,m);
// Do while loop where we compute u,s,v
for(int i = 0; i < 50; i++){
// Solve QR from transpose of s
t = tran(s);
qr(t, q, r);
freeMatrix(t);
// Copy values from r to s
copyval(r, s); // We do not need to delete r matrix yet
// Copy u = u*q
t = mul(u, q, false); // Not element wise
copyval(t, u);
freeMatrix(t);
// Solve QR from transpose of s
t = tran(s);
qr(t, q, r);
freeMatrix(t);
// Copy values from r to s
copyval(r, s); // We do not need to delete r matrix yet
// Copy v = v*q
t = mul(v, q, false);
copyval(t, v);
freeMatrix(t);
}
// Now we can delete r and q
freeMatrix(q);
freeMatrix(r);
// Fix the s and v matrix, turn all the non-diagonal to zeros
float* ptr_s = s->data;
float* ptr_v = v->data;
int n_s = s->row;
int m_s = s->column;
for(int i = 0; i < n_s; i++){
for(int j = 0; j < m_s; j++){
if(j != i){
*((ptr_s + i*n) + j) = 0; // Non-diagonal need to be zeros
}else{
*((ptr_s + i*n) + j) = -*((ptr_s + i*n) + j); // They are negative, turn them positive
}
*((ptr_v + i*n) + j) = - *((ptr_v + i*n) + j); // Important to shift the v-values
}
}
}
Jag tror vi alla skjuter över målet då herr Bundy inte förstått skillnaden mellan stackminne och dynamiskt allokerat minne. Som trådens historia visat så får vi låta insikterna sjunka in i hans egen takt. Eller studsa ut i intet till den dagen han förstår att Matlab-syntaxen kostar för mycket i prestanda. Själv är jag övertygad om att med välskriven C++ kan fixa det mesta av detta biblioteks problem då faktiskt templates och klasser kan underlätta en hel del. Och för att mota Olle i grind, ja man kan använda C++ på STM32, det handlar bara om att veta hur.Jag skyller på bekvämligheter. Det är svårt att skapa ett bibliotek som använder sig av statiska matriser.
Högerklicka Convert -> To C++ Project via System Workbench. Då har man C++. Men fortfarande så kommer det bli samma sak med C och C++ med 2D matriser.mankan skrev:Jag tror vi alla skjuter över målet då herr Bundy inte förstått skillnaden mellan stackminne och dynamiskt allokerat minne. Som trådens historia visat så får vi låta insikterna sjunka in i hans egen takt. Eller studsa ut i intet till den dagen han förstår att Matlab-syntaxen kostar för mycket i prestanda. Själv är jag övertygad om att med välskriven C++ kan fixa det mesta av detta biblioteks problem då faktiskt templates och klasser kan underlätta en hel del. Och för att mota Olle i grind, ja man kan använda C++ på STM32, det handlar bara om att veta hur.Jag skyller på bekvämligheter. Det är svårt att skapa ett bibliotek som använder sig av statiska matriser.
Det stämmer inte riktigt. Anledningen är att du ofta är relativt begränsad med vad gäller minne och resurser samt att inbyggda system ofta är realtidssystem vilket då kan ställa till det eftersom dynamisk minnesallokering inte är deterministisk.Al_Bundy skrev: Men frågan är hur mycket tid jag vinner. Jag kanske förlorar tid. Jag vet varför malloc inte ska användas inom inbyggda system och det har med att det kan vara lättare att göra fel med minnet om man inte hanterar det.
Jag känner till ordet deterministisk inom reglerteori, men inte inom datavärlden. Kan du utveckla?hummel skrev: Det stämmer inte riktigt. Anledningen är att du ofta är relativt begränsad med vad gäller minne och resurser samt att inbyggda system ofta är realtidssystem vilket då kan ställa till det eftersom dynamisk minnesallokering inte är deterministisk.
Kod: Markera allt
matrix* cutNoMalloc(matrix* a, int start_n, int stop_n, int start_m, int stop_m, matrix* out)
Kod: Markera allt
float c2Data[n + 1];
matrix c2Stack = { n + 1, 1, c2Data};
matrix* c2 = &c2Stack;
c2 = cutNoMalloc(q, 0, n, k,k, c2);
Nu hinner jag inte det imorgon då jag ska köra skoter hela dagen.mankan skrev:Det vore intressant att få veta prestandasiffror på STM32 så posta gärna här Al när du har testat.