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 »

Här är ett program för att estimera en tillståndsmodell.
Denna algoritm kommer jag köra. Men det är bara en del av algoritmen också.

Så det är svårt att säga exakt hur många matriser jag behöver. Men det är många.

Kod: Markera allt

#include <time.h>
#include "LinearAlgebra/declareFunctions.h"


int main() {

	/*
	 * G(s) = 1/(s^2 + 1s + 3)  - Model 
	 * y = measured output values
	 * u = measured input values
	 */

	clock_t start, end;
	float cpu_time_used;
	start = clock();

	float y[144] = { 0.00000, 0.49525, 1.43863, 2.13779, 2.30516, 2.05713,
			1.69220, 1.45608, 1.42777, 1.54146, 1.67927, 1.75624, 1.75400,
			1.70478, 1.65394, 1.62996, 1.63549, 1.65594, 1.67426, 1.68125,
			1.67752, 1.66930, 1.66285, 1.66102, 1.66300, 1.66621, 1.66842,
			1.66880, 1.66786, 1.66664, 1.66591, 1.66588, 1.66629, 1.66675,
			1.66698, 1.66695, 1.66678, 1.66661, 1.66654, 1.66657, 1.66664,
			1.66670, 1.66672, 1.66670, 1.66667, 1.66665, 1.66665, 1.66666,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66666, 1.66666,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667, 1.66667,
			1.66667, 1.66667, 1.66667, 1.66667, 1.66667 };

	float u[144] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
			5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
			5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
			5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
			5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
			5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
			5, 5, 5, 5, 5, 5, 5, 5, 5 };

	// Toeplitz matrix
	float toe[144 * 144];
	toeplitz(u, toe, 144);

	// Upper triangular
	float tru[144 * 144];
	triu(toe, tru, 0, 144, 144);

	// inverse
	inv(tru, 144);

	// Multiplication
	float g[144];
	mul(y, tru, false, g, 1, 144, 144);

	// Create hankel
	float H0[144 * 144];
	hankel(g, H0, 144, 1);
	float H1[144 * 144];
	hankel(g, H1, 144, 2);

	// Cut hankel into half
	float H0_half[72 * 72];
	float H1_half[72 * 72];
	cut(H0, 144, 144, H0_half, 0, 71, 0, 71);
	cut(H1, 144, 144, H1_half, 0, 71, 0, 71);

	// Do SVD
	float U[72 * 72];
	float S[72 * 72];
	float V[72 * 72];
	svd(H0_half, U, S, V, 72, 72);

	// Model reduction to second order model
	float Un[72 * 2];
	float Sn[2 * 2];
	float Vn[72 * 2];
	cut(U, 72, 72, Un, 0, 71, 0, 1);
	cut(S, 72, 72, Sn, 0, 1, 0, 1);
	cut(V, 72, 72, Vn, 0, 71, 0, 1);

	// Create A, B, C
	float Sn_sqrt_negative[2 * 2];
	float Sn_sqrt_positive[2 * 2];
	copy(Sn, Sn_sqrt_negative, 2,2);
	copy(Sn, Sn_sqrt_positive, 2,2);
	powdiag(Sn_sqrt_negative, -0.5, 2, 2);
	powdiag(Sn_sqrt_positive, 0.5, 2, 2);

	/*
	 * C = Un*Sn^(1/2);
	 * Cd = C(1, 1:2)
	 */
	float C[72 * 2];
	float Cd[1 * 2];
	mul(Un, Sn_sqrt_positive, false, C, 72, 2, 2);
	cut(C, 72, 2, Cd, 0, 0, 0, 1);

	/*
	 * Ad = Sn^(-1/2)*Un'*H1*Vn*Sn^(-1/2);
	 */
	float A[72 * 2];
	float A1[72 * 2];
	float Ad[2 * 2];
	float Ad1[2 * 2];
	mul(Vn, Sn_sqrt_negative, false, A, 72, 2, 2);
	mul(H1_half, A, false, A1, 72, 72, 2);
	tran(Un, 72, 2);
	mul(Un, A1, false, Ad1, 2, 72, 2);
	mul(Sn_sqrt_negative, Ad1, false, Ad, 2, 2, 2);

	/*
	 * B = Sn^(1/2)*Vn'
	 * Bd = B(:, 1);
	 */
	float B[2 * 72];
	float Bd[2 * 1];
	tran(Vn, 72, 2);
	mul(Sn_sqrt_positive, Vn, false, B, 2, 2, 72);
	cut(B, 2, 72, Bd, 0, 1, 0, 0);

	/*
	 * Print A, B, C
	 */
	printf("A Matrix: \n");
	print(Ad, 2, 2);

	printf("B Matrix: \n");
	print(Bd, 2, 1);

	printf("C Matrix: \n");
	print(Cd, 1, 2);

	end = clock();

	cpu_time_used = ((float) (end - start)) / CLOCKS_PER_SEC;
	printf("\nTotal speed  was %f,", cpu_time_used);

	return 0;
}
guckrum
Inlägg: 918
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisberäkningar med för STM32?

Inlägg av guckrum »

Att använda gitlab, github eller liknande för att dela kod är en bra ide' på många sätt...
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 ändå ingen som har kört mitt bibliotek här på forumet, så vad spelar det för roll om koden ligger på GitHub?
guckrum
Inlägg: 918
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Matrisberäkningar med för STM32?

Inlägg av guckrum »

Om du gör koden tillgängligt med versionshistorik, byggbeskrivning (Makefile?) och unittester kommer det i alla fall inte att minska möjligheten att någon tar sig en titt på den. Glöm inte följa licenskraven i koden du inkluderar!
bearing
Inlägg: 9034
Blev medlem: 2 mars 2006, 01:01:45
Ort: Vänersborg

Re: Matrisberäkningar med för STM32?

Inlägg av bearing »

Al_Bundy skrev:Det är ändå ingen som har kört mitt bibliotek här på forumet, så vad spelar det för roll om koden ligger på GitHub?
Jag körde ju ditt bibliotek, och hittade en bugg som jag rapporterade. Som jag även identifierade, samt till och med fixade genom att posta en färdig funktion. Inget märkvärdigt i och för sig. Så att jag inte fick något tack gjorde mig absolut ingenting.

Men nu när du kommer och påstår att << I n g e n b r y r s i g >>, då blir jag en aning upprörd.

Du har alltså 784 inlägg i den här tråden, från medlemmar som både enskilt, samt därmed i ännu högre grad - kollektivt, sitter på en oerhörd kunskap om mikrocontrollers, C-programmering, och C-kompilatorer. Flertalet medlemmar har, från deras inlägg att döma, kört din kod. De har till och profilerat den, och gissningsvis spenderat en ganska betydande tid på att läsa den. Så om vi räknar den kollektiva summan av spenderad tid och möda, blir det en oerhörd gåva från ett stort antal människor till dig! Du får hjälp som är oerhört kompetent. Jag tror att om du hade ringt till något företag för att be om support mot betalning, skulle du inte kunnat få hjälp som är lika kompetent som hjälp du fått här. Därför att även om personen du pratat med skulle varit riktigt duktig, skulle den inte ha den breda kunskap som finns bland medlemmarna som skrivit i den här tråden.

Men du utnyttjar inte kunskapen. Det är som om du bara kör på i din egna värld, utan att utnyttja hjälpen. Vilket ju är precis vad vi som hjälper till vill att du ska göra! För att om du använder hjälpen, betyder det ju att den insats vi lagt när vi skrivit i tråden har kommit till nytta! Jag vet inte hur många gånger i tråden du valt att bara släppa ett spår, helt utan förvarning, för att sätta igång med något annat. Vilket ett innebär att allt som investerats av oss hjälpsamma medlemmar därmed bara kastats bort!

Och du följer inte upp de föreslag och frågor som kommer i tråden! Det blir liksom aldrig någon riktig dialog mellan dig och den som försöker hjälpa dig. Vilket blir ett stort problem, eftersom att det oftast skulle räcka med endast en följdfråga från din sida för få ett svar som skulle få poletten att trilla ned och du skulle förstå! Så att du därmed skulle få nyttig kunskap (som dessutom förmodligen skulle bli ordentligt förankrad i dig, tack vare att den skulle kommit från flera informationsflöden, samt med feedback från lyckad praktisk tillämpning) samt att personen som hjälpt till skulle fått feedback på att deras pedagogik fungerar!

Vad beror det här på?
Jag har varit verksam på nätforum i större delen av mitt liv, och jag har aldrig varit med om någon som tidigare har betett sig såhär illa mot människor som försöker komma med nyttig information och tips för att hjälpa till i tekniska frågor!
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 »

guckrum skrev:Om du gör koden tillgängligt med versionshistorik, byggbeskrivning (Makefile?) och unittester kommer det i alla fall inte att minska möjligheten att någon tar sig en titt på den. Glöm inte följa licenskraven i koden du inkluderar!
Jag skickade hela mitt projekt + hur man kan sätta upp projektet igenom att kopiera in endast två mappar. Licenskrav? Jag kör MIT.

Jag hoppas att du kan se ett "nej" i mitt inlägg.
Senast redigerad av Al_Bundy 18 februari 2019, 15:06:04, 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 »

bearing skrev:
Al_Bundy skrev:Det är ändå ingen som har kört mitt bibliotek här på forumet, så vad spelar det för roll om koden ligger på GitHub?
Jag körde ju ditt bibliotek, och hittade en bugg som jag rapporterade. Som jag även identifierade, samt till och med fixade genom att posta en färdig funktion. Inget märkvärdigt i och för sig. Så att jag inte fick något tack gjorde mig absolut ingenting.

Men nu när du kommer och påstår att << I n g e n b r y r s i g >>, då blir jag en aning upprörd.

Du har alltså 784 inlägg i den här tråden, från medlemmar som både enskilt, samt därmed i ännu högre grad - kollektivt, sitter på en oerhörd kunskap om mikrocontrollers, C-programmering, och C-kompilatorer. Flertalet medlemmar har, från deras inlägg att döma, kört din kod. De har till och profilerat den, och gissningsvis spenderat en ganska betydande tid på att läsa den. Så om vi räknar den kollektiva summan av spenderad tid och möda, blir det en oerhörd gåva från ett stort antal människor till dig! Du får hjälp som är oerhört kompetent. Jag tror att om du hade ringt till något företag för att be om support mot betalning, skulle du inte kunnat få hjälp som är lika kompetent som hjälp du fått här. Därför att även om personen du pratat med skulle varit riktigt duktig, skulle den inte ha den breda kunskap som finns bland medlemmarna som skrivit i den här tråden.

Men du utnyttjar inte kunskapen. Det är som om du bara kör på i din egna värld, utan att utnyttja hjälpen. Vilket ju är precis vad vi som hjälper till vill att du ska göra! För att om du använder hjälpen, betyder det ju att den insats vi lagt när vi skrivit i tråden har kommit till nytta! Jag vet inte hur många gånger i tråden du valt att bara släppa ett spår, helt utan förvarning, för att sätta igång med något annat. Vilket ett innebär att allt som investerats av oss hjälpsamma medlemmar därmed bara kastats bort!

Och du följer inte upp de föreslag och frågor som kommer i tråden! Det blir liksom aldrig någon riktig dialog mellan dig och den som försöker hjälpa dig. Vilket blir ett stort problem, eftersom att det oftast skulle räcka med endast en följdfråga från din sida för få ett svar som skulle få poletten att trilla ned och du skulle förstå! Så att du därmed skulle få nyttig kunskap (som dessutom förmodligen skulle bli ordentligt förankrad i dig, tack vare att den skulle kommit från flera informationsflöden, samt med feedback från lyckad praktisk tillämpning) samt att personen som hjälpt till skulle fått feedback på att deras pedagogik fungerar!

Vad beror det här på?
Jag har varit verksam på nätforum i större delen av mitt liv, och jag har aldrig varit med om någon som tidigare har betett sig såhär illa mot människor som försöker komma med nyttig information och tips för att hjälpa till i tekniska frågor!
Jag talar om den senaste versionen jag har laddat upp. Jag kan se nu att det är 4 personer som har laddat ned mitt paket, där jag är en av dem. Alltså 3 pers har testat mitt bibliotek.

Du är väll den enda som har testat mitt bibliotek och gett mig en återkoppling, vilket jag har åtgärdat.
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 »

Nu har jag testat mitt bibliotek för en Windows dator med MinGW och det ger samma resultat som en Linux dator med GCC :) Det fungerar bra!
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 sant att man kan optimera mera för att använda mer befintliga matriser, men jag vet ändå inte om man kommer under 1 MB i RAM.

Jag använder för stora matriser. Optimerar jag så finns risken att koden blir opedagogisk. C-programmerare har en tendens att skriva kod som är helt obegriplig att läsa, för att koden ska vara så optimal som möjligt.

Så jag väntar till jag får nys på en uC som har mer RAM. Medan ska jag ge mig in på GTK för att skapa grafiska applikationer.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Matrisberäkningar med för STM32?

Inlägg av lillahuset »

C-programmerare har en tendens att skriva kod som är helt obegriplig att läsa, för att koden ska vara så optimal som möjligt.
Al, du är så full av skitsnack så man häpnar.
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 ger inget att hävda att jag är en skitsnackare. Vill du motbevisa mig så får du helt enkelt visa några exempel. Du kan ju ta mitt programexempel ovan och göra det mer optimerat, men det ska vara lika pedagogiskt som det vore själva MATLAB.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Matrisberäkningar med för STM32?

Inlägg av lillahuset »

Jag vidhåller min inställning. Du kanske ska återgå till ditt jobb som damskoförsäljare.
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 är en person som skriver kod som är pedagogiskt och enkelt att förstå. Fin kommentering och följer samma struktur igenom projektet. Jag eliminerar alla konstiga uttryck som inte har någon relevans och syfte. Detta kallas för god praktik.

Sedan finns det folk som lägger på det mest avancerade av avancerade för att skapa det optimala av det optimala. Då anser jag att fel verktyg har används, om man måste skriva en sådan svår kod. Kod ska vara enkelt att läsa och förstå. Man ska inte behöva sitta flera timmar på att gräva in sig i ett projekt.
Senast redigerad av Al_Bundy 18 februari 2019, 18:40:31, redigerad totalt 1 gång.
SvenW
Inlägg: 1080
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Matrisberäkningar med för STM32?

Inlägg av SvenW »

>> ska jag ge mig in på GTK för att skapa grafiska applikationer.
När det gäller oläslighet och obegriplighet, skall alla veta att GTK-programmering är sju resor värre än annan C-programmering.
Användarvisningsbild
hawkan
Inlägg: 1880
Blev medlem: 14 augusti 2011, 10:27:40

Re: Matrisberäkningar med för STM32?

Inlägg av hawkan »

Al_Bundy skrev: C-programmerare har en tendens att skriva kod som är helt obegriplig att läsa, för att koden ska vara så optimal som möjligt.
Ett omdöme om dej själv för det är du som programmerar i C nu :) hehe Så det måste ju vara helt sant :)

Har testat din kod. En utmaning att få den kompilerad, hade underlättat med Makefiler. Det kanske fanns i eclipse-projektet men att köra eclipse blir för mycket nytt att ta in. Ja men den verkar funka. Vet inte vad för resultat jag väntat mej.
Ser att du gjort om allt till "float" antagligen med tanke på mcun.

Det beror på hur du har tänkt att använda detta. Ska du ha in det i en mcu och köra detta i realtid i nån mening, så får du försöka skohorna in det. En processor som är mer lämplig. Strypa ner behovet av minne. Du kan använda pc-versionen för att jaga minne och testa. Nåt åt det hållet.

Ska det bara beräknas då och då så kan en Rpi eller en ncu kanske vara bättre. Då kan du kosta på dej störra matriser och räkna med dubbel precision.
Skriv svar