Re: Maskinellt lärande i inbyggda system - Vem är på?
Postat: 8 mars 2020, 22:42:29
Kompilerar den här koden?
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Adressen?Shimonu skrev:Okej, låt oss säga att det var sant. Varför räknar du ut adressen för varje element istället för att göra vanlig indexering? Är det också snabbare?
Bara att testa.hummel skrev:Kompilerar den här koden?
Kod: Markera allt
histograms + 256*i
Har du verifierat att det verkligen är så? Det är fullt möjligt att kompilatorn genererar ett liknande resultat, t o m effektivare, även av en for-loop. Försök optimera när du märker att det verkligen behövs, när programmet går märkbart långsamt. Och bli inte förvånad om det är en helt annan del av programmet som tar tid än vad du trodde.DanielM skrev:Det är bara 1 rad![]()
Jag gör så istället för att ha en for-loop. Har man en for-loop så tar det tid. Men gör man exakt allt på en enda rad så går det snabbt.
Förra gången funkade det inte på första eller andra eller om det var först på tredje försöket att kompilera koden.DanielM skrev:Shimonu skrev:Bara att testa.hummel skrev:Kompilerar den här koden?
DanielM skrev:Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.
Kod: Markera allt
// This is just a function to print out the trained histogram
void print_uint8_t(uint8_t* A, int row, int column) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
printf("%d ", *(A++));
}
printf("\n");
}
printf("\n");
}
// Images
uint8_t A[15*15] = {14,4,12,5,12,6,6,7,10,3,5,3,10,15,3,4,3,10,10,9,2,15,6,15,5,15,3,9,13,10,4,3,11,7,4,5,3,12,8,2,14,14,7,13,14,6,14,14,13,11,13,3,7,2,2,15,4,11,5,7,11,12,7,15,15,13,13,7,11,9,12,10,8,12,9,6,9,14,3,2,2,3,12,10,15,7,13,1,1,2,6,4,3,10,9,3,9,6,10,5,6,11,4,11,11,8,12,9,7,13,5,10,5,14,1,2,14,4,8,9,13,3,1,3,12,5,2,12,6,6,13,2,6,6,14,15,7,1,8,12,15,3,5,1,2,4,9,11,2,12,7,11,15,5,9,1,1,3,4,12,2,10,5,15,10,3,6,6,12,6,9,13,1,11,12,5,3,9,15,15,3,15,3,4,10,5,5,10,11,2,12,6,2,3,15,3,15,11,3,14,2,3,14,11,13,1,12,10,2,13,4,13,6,7,4,14,11,4,10,2,3,9,11,14,8};
uint8_t B[15*15] = {14,3,2,4,4,13,3,8,2,15,13,7,5,2,12,6,3,12,2,8,9,9,7,3,2,14,5,7,2,7,4,7,8,14,12,8,2,5,6,14,5,14,12,3,7,12,5,11,6,13,3,5,3,7,2,14,10,7,6,12,6,1,3,5,6,14,7,2,3,7,5,9,3,4,13,7,13,2,15,4,12,14,14,3,7,11,12,14,6,14,10,9,4,2,12,11,6,11,6,7,6,8,10,8,1,7,13,13,7,3,5,8,5,14,6,2,4,3,10,12,10,14,2,4,15,2,7,5,6,4,15,3,8,8,15,5,13,13,15,14,15,9,11,11,11,9,10,7,3,3,2,4,5,15,9,4,15,1,8,14,5,13,4,5,13,11,9,13,8,5,2,13,5,15,13,2,5,12,9,11,11,15,6,1,5,12,11,8,13,3,11,7,12,2,6,3,1,1,9,5,7,2,1,13,7,6,15,13,12,8,6,3,15,11,7,6,12,6,9,13,9,12,13,5,3};
uint8_t C[15*15] = {2,6,13,8,5,2,6,1,2,12,11,10,15,3,15,2,3,9,4,14,4,15,7,15,2,2,2,15,7,8,6,15,8,7,1,4,14,3,14,15,4,4,9,14,6,15,15,1,8,7,11,14,14,6,10,5,12,1,12,4,13,13,15,12,14,2,7,15,9,1,2,7,4,5,10,7,14,9,15,15,7,1,12,10,9,4,7,2,3,13,14,12,8,13,3,3,10,1,10,2,7,15,2,11,13,13,3,6,7,6,13,11,10,11,14,1,1,13,15,15,15,13,4,4,9,10,9,15,9,8,12,5,3,12,8,2,3,4,11,11,8,8,1,5,9,9,14,4,9,3,15,12,14,5,3,7,9,11,7,14,8,14,11,11,7,4,14,14,10,10,5,14,4,13,4,3,9,6,7,8,11,1,5,10,12,7,10,11,5,7,5,2,1,10,6,6,3,7,9,6,8,4,10,2,9,1,12,6,2,8,9,8,3,2,3,12,1,12,2,2,10,11,10,12,9};
uint8_t D[15*15] = {5,7,5,2,11,9,15,15,7,2,14,9,13,3,8,6,3,3,12,3,11,12,9,2,4,10,5,5,14,15,1,11,3,5,10,4,2,9,13,9,11,10,15,9,5,2,7,10,5,9,7,4,14,11,1,7,15,10,12,3,8,12,14,14,12,14,10,11,13,7,11,6,4,9,8,4,3,11,6,4,8,7,2,14,3,2,14,15,5,4,15,1,15,15,4,5,5,7,14,12,11,13,14,13,14,12,2,12,13,3,13,3,2,12,4,11,8,12,12,10,14,11,12,12,5,6,15,6,6,11,14,7,2,13,11,10,15,5,15,12,5,6,9,1,2,5,13,2,6,9,11,4,2,15,12,1,1,11,15,8,9,12,1,8,9,2,15,4,12,8,1,7,7,12,11,10,11,12,13,15,15,14,11,6,10,1,13,2,4,11,2,3,8,14,7,2,10,13,6,12,5,9,9,5,15,10,6,2,11,3,10,15,11,8,13,9,10,9,8,9,6,4,9,12,5};
uint8_t E[15*15] = {15,1,13,6,9,8,15,13,15,7,13,10,5,4,10,9,10,4,4,5,6,8,5,13,6,12,13,12,2,1,11,13,11,10,15,15,8,11,10,2,6,9,1,6,1,15,6,6,11,8,15,14,4,9,4,10,10,13,13,5,6,13,12,4,9,14,4,3,14,11,2,9,2,3,3,14,13,2,6,5,12,4,1,2,5,8,1,14,6,7,5,6,3,14,7,13,4,13,6,11,10,1,4,6,9,12,6,6,6,15,7,6,14,13,8,15,11,15,14,13,6,4,7,5,3,8,14,7,13,8,2,1,10,13,7,8,2,7,15,9,10,7,11,15,7,5,15,13,14,3,5,9,11,6,3,12,15,4,13,7,13,11,9,1,9,2,12,4,10,11,6,3,14,4,13,1,3,13,14,6,9,15,1,6,8,10,14,2,13,2,15,10,1,4,4,3,5,8,5,1,15,14,2,15,7,4,13,10,1,7,10,3,12,14,14,14,3,3,8,1,2,15,4,15,3};
uint8_t F[15*15] = {7,15,9,6,10,4,11,8,4,14,9,10,8,14,13,10,3,7,1,4,3,12,2,15,11,14,2,14,8,4,1,7,15,14,12,5,6,14,11,14,2,5,2,4,14,15,9,4,5,5,14,12,6,1,12,7,6,14,3,11,13,1,3,1,10,13,9,1,5,5,11,2,3,12,8,14,15,1,1,1,9,14,9,14,9,10,9,1,2,12,11,4,6,13,10,3,13,7,12,8,14,5,2,13,11,6,3,10,12,6,13,4,4,2,14,13,9,14,9,9,8,15,2,12,14,6,1,7,14,12,4,12,2,8,11,11,10,13,15,9,9,8,11,4,15,14,10,13,11,9,1,12,15,2,9,1,6,2,15,4,1,14,1,14,8,10,5,6,15,6,13,13,4,4,4,12,1,7,3,12,5,12,9,15,7,15,6,3,9,10,7,10,2,11,1,6,15,4,5,3,2,7,14,4,12,11,11,8,12,1,15,10,7,10,2,4,14,4,1,10,1,2,14,9,8};
uint8_t G[15*15] = {15,5,15,11,5,15,8,2,8,13,5,13,1,7,6,15,1,4,1,10,7,2,1,4,6,4,1,11,6,8,2,5,6,2,1,6,13,6,5,12,15,15,8,6,10,2,8,1,14,3,11,12,3,7,9,3,1,7,11,4,13,10,13,10,10,3,8,1,2,3,5,14,15,14,4,1,2,11,14,9,13,14,15,1,5,11,10,15,6,15,2,13,1,14,6,6,5,7,6,15,13,6,3,14,13,11,12,1,4,9,2,8,14,4,4,2,4,12,4,13,14,10,7,10,5,5,2,11,12,6,14,15,7,8,8,7,14,7,15,1,14,5,3,11,1,10,5,5,15,2,8,13,7,10,5,5,10,14,13,6,10,2,10,8,1,13,3,10,8,15,2,8,3,12,12,11,8,5,3,11,4,11,2,4,10,5,7,6,15,1,10,5,1,12,10,5,12,13,2,2,2,9,14,12,15,7,11,12,7,3,3,3,12,15,2,1,13,13,15,14,8,4,8,6,1};
uint8_t H[15*15] = {6,9,14,11,7,13,11,8,10,7,4,8,9,12,3,11,3,9,15,1,11,2,4,8,7,2,1,1,5,5,12,6,6,14,6,4,7,10,15,14,5,13,4,9,3,6,7,1,10,6,15,8,10,5,9,7,8,1,10,11,6,2,2,1,3,8,14,7,2,14,8,6,3,5,12,11,6,15,13,3,8,11,2,15,15,10,5,13,5,11,15,10,4,5,6,1,6,12,9,15,15,7,4,2,4,13,2,9,5,8,3,6,11,1,7,7,2,9,1,11,15,3,3,15,14,8,3,7,5,2,13,5,6,9,8,8,13,15,5,1,12,2,15,5,7,13,1,3,8,14,11,6,10,14,6,1,15,2,14,8,15,7,11,15,11,5,12,9,1,14,14,8,3,1,6,10,2,8,6,3,9,11,9,7,1,1,6,7,3,14,4,12,13,3,10,5,15,13,1,5,13,10,1,9,14,15,1,1,12,3,5,3,10,5,10,11,15,4,6,10,8,3,3,4,11};
uint8_t I[15*15] = {2,8,10,10,14,11,14,13,14,2,15,5,3,5,11,14,8,7,3,6,7,11,9,5,5,12,5,9,9,6,13,3,6,8,6,6,6,1,11,12,10,6,6,2,5,15,3,14,9,2,4,10,3,8,15,2,11,7,8,11,9,10,10,15,1,2,5,12,14,11,2,4,2,7,11,9,15,1,5,14,8,2,6,5,14,8,10,5,4,14,9,7,3,11,4,8,5,4,15,5,9,9,1,2,7,8,2,3,8,5,2,2,13,4,15,11,4,14,1,1,8,3,2,6,15,11,13,1,3,6,3,3,2,7,13,8,3,14,2,15,3,14,13,4,2,11,13,6,15,9,13,6,9,9,13,11,9,14,1,6,10,15,1,3,8,2,7,5,6,2,4,4,3,7,5,13,10,4,2,6,11,3,4,2,10,1,8,13,5,5,12,4,4,13,13,8,13,9,3,11,8,1,10,5,10,13,13,1,2,2,12,14,15,8,1,14,4,3,15,6,15,2,15,9,3};
uint8_t J[15*15] = {1,5,10,14,12,9,6,11,4,13,3,5,6,13,10,9,8,2,4,6,13,6,12,5,4,12,14,8,3,11,1,7,3,3,6,1,9,7,12,4,1,6,8,7,12,11,2,15,9,14,7,4,8,14,8,11,9,3,11,9,15,3,3,15,4,5,7,10,13,6,12,5,3,10,10,5,7,1,8,15,8,2,8,3,8,3,12,2,4,12,5,11,13,8,4,1,6,3,11,15,5,12,9,12,3,13,9,8,7,2,3,14,1,1,3,13,2,14,8,12,10,7,9,13,2,8,1,5,9,14,1,1,9,12,15,9,13,1,13,10,10,2,14,10,9,6,10,8,2,13,1,7,4,10,8,14,14,8,5,10,2,7,11,3,6,14,6,13,6,11,12,11,7,15,14,2,11,5,2,3,13,2,11,11,5,14,12,8,4,2,4,5,2,13,1,8,12,10,6,2,12,11,3,11,5,1,7,12,1,3,1,6,6,2,15,10,7,11,5,14,6,13,8,10,10};
// Histogram holder
uint8_t histograms[10*256]; // 10 because we have 10 pictures to train
int main() {
clock_t start, end;
float cpu_time_used;
start = clock();
// Train first the pictures
uint16_t status = lbph(A, 15, 15, histograms, 1, true); // Save at first row
status = lbph(B, 15, 15, histograms, 2, true);
status = lbph(C, 15, 15, histograms, 3, true);
status = lbph(D, 15, 15, histograms, 4, true);
status = lbph(E, 15, 15, histograms, 5, true);
status = lbph(F, 15, 15, histograms, 6, true);
status = lbph(G, 15, 15, histograms, 7, true);
status = lbph(H, 15, 15, histograms, 8, true);
status = lbph(I, 15, 15, histograms, 9, true);
status = lbph(J, 15, 15, histograms, 10, true); // Save at last row
// Print the histograms
print_uint8_t(histograms, 10, 256);
// Now do an image classification
uint16_t index = lbph(J, 15, 15, histograms, 10, false) - 2;
printf("The image is index: %d, and status is: %d\n", index, status);
end = clock();
cpu_time_used = ((float) (end - start)) / CLOCKS_PER_SEC;
printf("\nTotal speed was %f\n", cpu_time_used);
return EXIT_SUCCESS;
}
Shimonu skrev:DanielM skrev:Jag har för mig att skriva array är exakt samma som *(array + i).
Jag ser många gör så här.
Ena sättet är väl klart enklare och mer läsbart än det andra?
Ha Ha Ha// Notice that this is only one line of code. Super fast way to do this
Kod: Markera allt
integral += *(pekare + faktor*i);
Kod: Markera allt
integral += *pekare;
pekare += faktor;
Tänk en gång till.Jag behöver inte ta abs på alla element. Jag kan summera först och sedan ta abs. Då sparar jag ännu mera tid.
Har du tittat på den genererade assemblern?DanielM skrev:Det är bara 1 rad![]()
Jag gör så istället för att ha en for-loop. Har man en for-loop så tar det tid. Men gör man exakt allt på en enda rad så går det snabbt.