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 »

Testa om du kan hitta några problem med denna kod. Jag har kört andra typer av värden, och då fungerar det. Därför tror jag inte att just min qr.c fil inte kan hantera stora siffror. Men det lustiga är att koden nedanför, dvs MATLAB koden, är det samma som denna C-kod. MATLAB-koden fungerar utmärkt som vi såg!

Därför tror jag att C++ och Armadillo passar STM32 och kan lösa dessa typer av problem. Men då är det ett annat problem jag måste tackla och det är att Armadillo håller också på med minnesallokering. Så om det vore riktigt dåligt att använda minnesallokering på uC, vilket många har påpekat här. Då finns det inget annat alternativ för mig än att köra Java.

Kod: Markera allt

void qr(matrix* a, matrix* q, matrix* r) {

	// Get info about matrix a
	int n = a->row;
	int m = a->column;
	float* ptr = a->data;

	// Get data
	float* ptr_q = q->data;
	float* ptr_r = r->data;

	matrix* c1;
	matrix* c2;


	for(int k = 0; k < m; k++){
		// Insert vector
		for(int j = 0; j < n; j++)
			*((ptr_q + j*n) + k) = *((ptr + j*n) + k);

		// Do the dot product
		for(int i = 0; i < k; i++){
			c1 = cut(q, 0, n-1, i, i);
			c2 = cut(q, 0, n-1, k,k);
			*((ptr_r + i*n)+k) = dot(c1, c2);
			freeMatrix(c1);
			freeMatrix(c2);

			// Insert vector again
			for(int j = 0; j < n; j++)
				*((ptr_q + j*n) + k) = *((ptr_q + j*n) + k) - *((ptr_r + i*n)+k)*(*((ptr_q + j*n) +i));

		}

		c1 = cut(q, 0, n-1, k, k);
		*((ptr_r+k*n)+k) = -norm(c1); // Important with negative
		freeMatrix(c1);
		// Insert vector again
		for(int j = 0; j < n; j++){
			if(*((ptr_r + k*n) + k) ==  0){
				*((ptr_r + k*n) + k) = pow(2.2204, -16); // Same as eps command in MATLAB
			}
			*((ptr_q + j*n) + k) = (*((ptr_q + j*n) + k)) / (*((ptr_r + k*n) + k));
		}

	}

}

/* MATLAB CODE
 * function [Q,R] =  mgs(X)
    % Modified Gram-Schmidt.  [Q,R] = mgs(X);
    % G. W. Stewart, "Matrix Algorithms, Volume 1", SIAM, 1998.
    [n,p] = size(X);
    Q = zeros(n,p);
    R = zeros(p,p);
    for k = 1:p
        Q(:,k) = X(:,k);
        for i = 1:k-1
            R(i,k) = Q(:,i)'*Q(:,k);
            Q(:,i)'*Q(:,k)
            Q(:,k) = Q(:,k) - R(i,k)*Q(:,i);
        end
        R(k,k) = -norm(Q(:,k))';
        Q(:,k) = Q(:,k)/R(k,k);
    end
end
 */
Senast redigerad av Al_Bundy 30 januari 2019, 12:07:49, redigerad totalt 1 gång.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Matrisberäkningar med för STM32?

Inlägg av Magnus_K »

Beklagar det störande inlägget.
Vi kanske kan göra så att ett svar på min fråga märks tydligt med @Magnus_K, eller något...

Blev bara lite frustrerad nu för fastän jag har följt varenda inlägg i den här 32 sidor långa tråden (och finner den fortfarande intressant) så förstår jag fortfarande inte ett skit.
Vad använder man matrisberäkning till? Har det enbart med AI och annat avancerat att göra eller är detta vardag för en programmerare som ska få en kaffemaskin att brygga kaffe enligt valt program?

En matris ser ut som en tabell, varför kan man inte behandla den som 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 »

Hej!

Linjär algebra handlar om att kombinera saker. Ja, det används inom machine learning och reglerteknik.

Matriser är en tabell, ja. Jag behandlar dem som tabeller.
bearing
Inlägg: 11652
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Matrisberäkningar med för STM32?

Inlägg av bearing »

Jag kommer inte testa din kod. Det kommer ju ta lång tid. Och dessutom vet jag som sagt inte så mycket om de här matrisoperationerna, så då blir jag en dålig testare. Det bästa är om testaren är insatt i vad som ska göras och vad som händer på vägen. D.v.s du själv tror jag vore en bra testare.

Sätt bara en brytpunkt i botten på diverse loopar, kör till brytpunkten, titta på hur matriserna ser it, kör till brytpunkten igen, och titta hur värdena utvecklar sig för varje varv i loopen, o.s.v.
Har för mig att du hade en loop från 0-50, t.ex. Den skulle jag börja med. Det är antagligen några värden som inte "konvergerar" (utan sticker iväg, som jag uttrycker det på lekmannaspråk). Men du kan sannolikt mer om sånt än mig.
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 »

Jag får göra det! Sätta mig ned och gå igenom qr.c koden en gång till.
Om koden fungerar för MATLAB, så måste den fungera för C också?
bearing
Inlägg: 11652
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Matrisberäkningar med för STM32?

Inlägg av bearing »

Magnus_K skrev:Vad använder man matrisberäkning till
Används mycket inom avancerade reglersystem. Kalmanfilter och sånt.

I grund och botten är väl matrisalgebran hjälpmedel för att lösa ekvationssystem med många parametrar.

Kalle köpte 2 äpplen och en banan för 11 kronor
Emma köpte ett äpple och fem bananer för 19 kronor
Hur mycket kostar frukterna?

Detta kan man lösa med hjälp av matriser om man vill. Och det blir mycket enklare att lösa med hjälp av matriser än för hand för större ekvationssystem. T.ex. om en skolklass har köpt olika mängder av hela affärens fruktutbud, och så vill man ta reda på priset på varje frukt.
bearing
Inlägg: 11652
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Matrisberäkningar med för STM32?

Inlägg av bearing »

Al_Bundy skrev:Jag får göra det! Sätta mig ned och gå igenom qr.c koden en gång till.
Om koden fungerar för MATLAB, så måste den fungera för C också?
I Matlab/Octave kanske det redan finns inbyggd kod som hjälper värden att konvergera?
Ingen aning, bara en gissning.

Du ändrade i ett inlägg här ovan, där jag tror att du skrev att funktionen tydligen fungerade med vissa indata? Och gav samma resultat som Octave? (men jag såg det bara snabbt innan du ändrade)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Matrisberäkningar med för STM32?

Inlägg av Magnus_K »

bearing skrev:
Magnus_K skrev:Vad använder man matrisberäkning till
Används mycket inom avancerade reglersystem. Kalmanfilter och sånt.

I grund och botten är väl matrisalgebran hjälpmedel för att lösa ekvationssystem med många parametrar.

Kalle köpte 2 äpplen och en banan för 11 kronor
Emma köpte ett äpple och fem bananer för 19 kronor
Hur mycket kostar frukterna?

Detta kan man lösa med hjälp av matriser om man vill. Och det blir mycket enklare att lösa med hjälp av matriser än för hand för större ekvationssystem. T.ex. om en skolklass har köpt olika mängder av hela affärens fruktutbud, och så vill man ta reda på priset på varje frukt.
Det var en bra förklaring bearing, det tackar jag för :tumupp:
Jag förstår precis vad ni menar men har nog inte förstått komplexiteten i det än.
Fortsätter mitt stilla iakttagande :)
hawkan
Inlägg: 3339
Blev medlem: 14 augusti 2011, 10:27:40

Re: Matrisberäkningar med för STM32?

Inlägg av hawkan »

En grej som kan testas, om det ändå ska testas, är att byta alla "float" mot "double". Substitute all eller vad det kan heta.
Då vet du skillnad både i resultat och beräkningstid. Bara en idé, men jag hade gjort det. Jag hade för övrigt aldrig
gjort linear algebra med float, vad en sån åsikt nu kan vara värd.
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 »

Men hur som helst. Hur stor sannolikhet kommer jag få problem om jag har minnesallokering på uC? Om svaret är att jag kommer få ostabilitet, så kan jag inte köra matrisberäkningar på uC. Då är det PC som gäller.
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:En grej som kan testas, om det ändå ska testas, är att byta alla "float" mot "double". Substitute all eller vad det kan heta.
Då vet du skillnad både i resultat och beräkningstid. Bara en idé, men jag hade gjort det. Jag hade för övrigt aldrig
gjort linear algebra med float, vad en sån åsikt nu kan vara värd.
Eller så testar ni att ta bort denna kod-rad.

Kod: Markera allt

*((ptr_q + j*n) + k) = *((ptr_q + j*n) + k) - *((ptr_r + i*n)+k)*(*((ptr_q + j*n) +i));
Den verkar inte göra någon skillnad för q-matrisen. :?
hawkan
Inlägg: 3339
Blev medlem: 14 augusti 2011, 10:27:40

Re: Matrisberäkningar med för STM32?

Inlägg av hawkan »

Al_Bundy skrev:Men hur som helst. Hur stor sannolikhet kommer jag få problem om jag har minnesallokering på uC? Om svaret är att jag kommer få ostabilitet, så kan jag inte köra matrisberäkningar på uC. Då är det PC som gäller.
Det finns alltid alternativa vägar att sköta minneshantering.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Matrisberäkningar med för STM32?

Inlägg av sodjan »

> Hur stor sannolikhet kommer jag få problem om jag har minnesallokering på uC?

Vill du ha ett procenttal mellan 0 och 100? Jag tror inte att det går att förenkla på det sättet.
Det är så väldigt applikationsberoende. Och hur minnet "används" totalt. Hur trångt är det
i minnen, är nästan allt redan använt till applikationen. O.s.v o.s.v.

Du har en förmåga att tolka "det kan bli problem med dynamisk allokering på plattformar med
begränsade resurser" till att "malloc() fungerar inte alls på uC". Det är ju design avvägningar
hela tiden som man (du) måste göra.

Rent personligen så tror jag att hela ditt projekt är en återvändsgränd. Men det är ju bara jag...
bearing
Inlägg: 11652
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Matrisberäkningar med för STM32?

Inlägg av bearing »

Al_Bundy skrev:
hawkan skrev:En grej som kan testas, om det ändå ska testas, är att byta alla "float" mot "double". Substitute all eller vad det kan heta.
Då vet du skillnad både i resultat och beräkningstid. Bara en idé, men jag hade gjort det. Jag hade för övrigt aldrig
gjort linear algebra med float, vad en sån åsikt nu kan vara värd.
Eller så testar ni att ta bort denna kod-rad.

Kod: Markera allt

*((ptr_q + j*n) + k) = *((ptr_q + j*n) + k) - *((ptr_r + i*n)+k)*(*((ptr_q + j*n) +i));
Den verkar inte göra någon skillnad för q-matrisen. :?

Det blir ju lite krångligt att förstå det där, med alla *-tecken överallt.

Du kan ju lägga in alla uttryck som liknar *((ptr_r + i*n)+k) i temporära variabler med vettiga namn, och köra ovanstående beräkning på de temporära variablerna. Då kan du titta på och titta på varje sådan temporär, och kontrollera att de stämmer, d.v.s att den tagit rätt element ur matrisen, så att du vet att någon av de där i,j,k,q,r, o.s.v är inknappat på rätt ställe.

Jag använder nästan aldrig variabler som är endast en bokstav, eftersom att det är så svårt att förstå koden och hitta buggar. Men matematisker gillar ju det.
Senast redigerad av bearing 30 januari 2019, 12:47:19, redigerad totalt 1 gång.
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:
Al_Bundy skrev:Men hur som helst. Hur stor sannolikhet kommer jag få problem om jag har minnesallokering på uC? Om svaret är att jag kommer få ostabilitet, så kan jag inte köra matrisberäkningar på uC. Då är det PC som gäller.
Det finns alltid alternativa vägar att sköta minneshantering.
Klart det finns. Men då tappar man sin MATLAB-struktur.
sodjan skrev:> Hur stor sannolikhet kommer jag få problem om jag har minnesallokering på uC?

Vill du ha ett procenttal mellan 0 och 100? Jag tror inte att det går att förenkla på det sättet.
Det är så väldigt applikationsberoende. Och hur minnet "används" totalt. Hur trångt är det
i minnen, är nästan allt redan använt till applikationen. O.s.v o.s.v.

Du har en förmåga att tolka "det kan bli problem med dynamisk allokering på plattformar med
begränsade resurser" till att "malloc() fungerar inte alls på uC". Det är ju design avvägningar
hela tiden som man (du) måste göra.

Rent personligen så tror jag att hela ditt projekt är en återvändsgränd. Men det är ju bara jag...
I detta fall använder jag max 10 matriser åt gången. Så fort jag har använt en matris, så tar jag bort den. Kan inte ta upp så mycket minne då.
Skriv svar