Matrisberäkningar med för STM32?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

hawkan skrev:Du gör free() på pekaren till minnet. Kräver att minnet är allokerat med malloc().
Annars blir det fel. Att hålla på med malloc/free är inte speciellt effektivt.
Bättre du lägger de på stacken.
Nu har jag ju skrivit rätt mycket C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre. När användaren skapar en matris så skapas nytt minne. Men man kan ju skita i och radera matrisen. Den går ju att återanvända.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Någon som brukar använda sig av matrisberäkningar här? Tänkte bara fråga er vilka matrisfunktioner som ni tycker är viktiga?

För mig så är det viktigt med grundläggande matrishantering + QR, chol, LU, SVD, det, inv, hankel. Men det har med att jag ska ju göra ett bibliotek som är anpassat för regression. Eigenvärden kan jag totalt glömma. Krävs alldeles för mycket för att beräkna Francis QR Shift Step algoritm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45410
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av TomasL »

Nu har jag ju skrivit rätt mycket C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre. När användaren skapar en matris så skapas nytt minne. Men man kan ju skita i och radera matrisen. Den går ju att återanvända.
Du gör väl inte detta i en uC?? Det är ju i så fall fullständigt vansinnigt.
hummel
Inlägg: 2276
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Matrisberäkningar med för STM32?

Inlägg av hummel »

Al_Bundy skrev:
TomasL skrev:Jamen, när du raderat den, så har du ju ingen matris kvar.
Dessutom, dynamisk minnesallokering i inbäddade system är ingen bra grej. Bör undvikas som pesten.
Jasså? Så malloc, mmset och free bör ej användas alls?
I ett inbyggt system med realtidskrav ska du inte använda dynamisk minnesallokering.

Tycker Mr Andersson beskriver bra hur der fungerar. Vad är det för funktionalitet är det som du saknar i C? Är det bara sockret som nya språk har du saknar?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45410
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av TomasL »

Men nu verkar det ju inte vara ett realtidssystem, utan nån form av handhållen matrisräknare, där en användare valfritt skall kunna skapa matriser, eller vad i helsike handlar det om?
hummel
Inlägg: 2276
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Matrisberäkningar med för STM32?

Inlägg av hummel »

Tyckte Al tidigare i tråden pratade om ett reglersystem så någon form av tid kan nog vara inblandad. Men i den här tråden kan vi inte vara säkra.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

TomasL skrev:
Nu har jag ju skrivit rätt mycket C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre. När användaren skapar en matris så skapas nytt minne. Men man kan ju skita i och radera matrisen. Den går ju att återanvända.
Du gör väl inte detta i en uC?? Det är ju i så fall fullständigt vansinnigt.
Varför är det vansinnigt att allokera minne?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45410
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av TomasL »

C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre
Är rätt dumt. Eller menar du programmeraren?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

hummel skrev:
Al_Bundy skrev:
TomasL skrev:Jamen, när du raderat den, så har du ju ingen matris kvar.
Dessutom, dynamisk minnesallokering i inbäddade system är ingen bra grej. Bör undvikas som pesten.
Jasså? Så malloc, mmset och free bör ej användas alls?
I ett inbyggt system med realtidskrav ska du inte använda dynamisk minnesallokering.

Tycker Mr Andersson beskriver bra hur der fungerar. Vad är det för funktionalitet är det som du saknar i C? Är det bara sockret som nya språk har du saknar?
Jag tycker att man borde kunna retunera flera värden samtidigt, utan att använda pekare. Detta skulle vara bra. Och lägg till objektorientering i C!

Sockret?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

TomasL skrev:
C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre
Är rätt dumt. Eller menar du programmeraren?
Ja, men varför är det dumt? Programmeraren kan skita i att ta bort matriserna och använda dem igen. Jag har bara gjort en funktion som kan radera en matris, om användaren vill det.

Om det är dumt att ha dynamisk minne på en uC så litar jag på dig. Jag är nybörjare med C.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

hummel skrev:Tyckte Al tidigare i tråden pratade om ett reglersystem så någon form av tid kan nog vara inblandad. Men i den här tråden kan vi inte vara säkra.
Helt rätt. Det ska vara ett reglersystem som utför matrisberäkningar. Högsta matrisen är 36x36.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45410
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av TomasL »

Al_Bundy skrev:
TomasL skrev:
C-kod som ger användaren friheten att radera en matris när användaren inte använder matrisen längre
Är rätt dumt. Eller menar du programmeraren?
Ja, men varför är det dumt? Programmeraren kan skita i att ta bort matriserna och använda dem igen. Jag har bara gjort en funktion som kan radera en matris, om användaren vill det.

Om det är dumt att ha dynamisk minne på en uC så litar jag på dig. Jag är nybörjare med C.
Är det programmeraren eller användaren som skall skapa nya matriser?
Och ja, man använder aldrig någonsin dynamisk allokerat minne i en inbäddad enhet/microkontroller.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Det är självklart programmeraren som skapar nya matriser. Men vissa funktioner har faktiskt automatiskt borttagning av matriser när man har anropat klart funktionen. Kanske är onödigt?

Jag har alltid för mig att man ska allokera minne i C för att spara på minne. Detta gäller för inbyggda system.

Så här gör jag när jag allokerar minne för en matris.

Kod: Markera allt

matrix* initMatrix(int row, int column) {
	matrix* out = (matrix*) malloc(sizeof(matrix));

	out->column = column;
	out->row = row;
	out->data = (float*) malloc(sizeof(float) * column * row);

	memset(out->data, 0.0, column * row * sizeof(float));

	return out;
}
Och strukturen är

Kod: Markera allt

typedef struct _matrix {
    int row;
    int column;
    float* data;
} matrix;

Här är en funktion som skapar en nollmatris.

Kod: Markera allt

matrix* zeros(int n, int m) {

	matrix* out = initMatrix(n, m);

	float* ptr = out->data;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			*(ptr++) = 0.0;
		}
	}

	return out;
}
Hur skulle du göra detta om du använde dig av en 2D array?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45410
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av TomasL »

Skapa matriserna statiskt, du vet väl alltid hur stora de skall vara.
I ett inbäddat system är dynamisk allokering absolut förbjudet. (Enligt MISRA), vilket är en bra standard att jobba efter.
Jag skulle dessutom aldrig använda float, om inte processorn i fråga har en fullständig FPU (och kompilatorstöd för det).
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Matrisberäkningar med för STM32?

Inlägg av Al_Bundy »

Okej! Då får jag helt enkelt skriva om till statiska arrayer. Orsaken varför jag gjorde så här har med att jag kunde inte hitta storleken på matrisen när jag skickade dem över funktionen.

Min uC har stöd för float. Jag vet inte annars vad jag ska använda. Double är ju 64 bit.

Jag testade med detta, men det gick inte.

Kod: Markera allt



void testFunction(float** arr){
	int m  = sizeof(arr)/sizeof(arr[0][0]);
	printf("Kolumnen är m = %d", m);
}

int main(){

float values[5][5] = { { 2, 3, 1, 0.5, 4 },
			{ 4, 5, 7, 0.1, 1 },
			{ 5, 3, 6, 19.2, 9 },
			{ 1, 4, 1, 4, 7 },
			{ 3, 1, 6, 2, 6 } };


	testFunction(values);
}
Skriv svar