cut.c suger mycket tid och ett förslag från mig är att göra så att man kan börja vid korrekt rad och korrekt kolumn.
Nu måste jag sova, men för er övriga så kan jag säga att denna tanke är ungefär rätt. Nackdelen är att indexeringen är inte helt synkad. Har ni andra förslag så säg bara till.
Teorin bakom cut är att man ska kunna skära av en t.ex. 5x5 matris till 2x2 matris - linjärt.
matrix* cut(matrix* a, int start_n, int stop_n, int start_m, int stop_m) {
// Create the output
matrix* out = initMatrix(stop_n - start_n+1, stop_m - start_m+1);
float* ptr = out->data;
float* data = a->data;
float empty = 0; // This variable works only so we can bypass the values from data that we don't want
for (int i = start_n; i < stop_n; i++) {
for (int j = start_m; j < stop_m; j++) {
*(ptr++) = *((data + i*stop_n) + j); // In med denna
/* Bort med denna kod
// if i is equal to the row element and the same as for j with columns
if (i >= start_n && i <= stop_n && j >= start_m && j <= stop_m) {
*(ptr++) = *(data++); // add
} else {
empty = *(data++);
}
*/
}
}
empty = empty*0; // This will remove the warning "variable not used"
return out;
}
Jag är absolut inte bra på c, men jag tycker det ser lite lustigt ut med empty.
Kan du inte bara i else köra data++, och ta bort allt med empty?
Vad ska "empty = *(data++)" göra?
pow(<konstant uttryck>) beräknas många gånger inuti loopar, kanske kompilatorn optimerar bort det men det bör räcka med en gång per funktion eller tom deklarera en global konstant.
absm (eller vad filen heter) använder heltalsfunktionen abs och inte fabs. Jag tror inte du vill ha avrundning här.
Enligt profileringsdatat så läcker det minne. Du har 7 färre anrop till freeMatrix än initMatrix.
Fundera på om initMatrix verkligen ska nolla matrisen. Det kanske är helt onödigt många gånger.
>> Enligt profileringsdatat så läcker det minne. Du har 7 färre anrop till freeMatrix än initMatrix.
Okej! Då har jag glömt att radera några matriser i min funktion. Om ni undrar VARFÖR jag har valt att koda så här så har detta med:
1. Jag använder 2D matriser i form av strukturer och pekare
2. Jag vill att biblioteket ska vara så lik MATLAB som möjligt. Detta är det viktigaste för man vill ofta konvertera om MATLAB kod till C-kod. I Armadillo C++ så kan man detta, men det är ett stort bibliotek för C++. Nu är min STM32 för C.
Det är bra att nolla matisen. Detta sker nu idag med memset.
Senast redigerad av Al_Bundy 23 januari 2019, 11:33:39, redigerad totalt 1 gång.
Ja, fast det var inte den raden jag ifrågasatte utan empty = *(data++); den går att ersätta med data++;
Och då kan du ta bort empty helt och hållet eftersom du precis som kompilatorn påpekar inte använder den till något vettigt.
Al_Bundy skrev:Fast jag gör det mer i svd.c och svd.c går snabbare än qr.c
Orsaken varför jag har valt detta har med att biblioteket ska vara så MATLAB-likt som möjligt. Jag vet inte vad du menar med profilera koden. Jag vet inte vad du menar med stack, men jag har för mig att det har med lite mer med minneshantering typ som kö och lista.
Tror det är problemets kärna här. Vill man inte eller kan man inte sätta sig in dessa delar är det enklaste lösningen att skaffa snabbare processor och mer minne så KAN det fungera ändå. Snabbaste lösningen är självklart att man löser det med aktuell hårdvara.
matrix* cut(matrix* a, int start_n, int stop_n, int start_m, int stop_m) {
int n = a->row;
float* data = a->data;
// Create the output
matrix* out = initMatrix(stop_n - start_n+1, stop_m - start_m+1);
float* ptr = out->data;
for (int i = start_n; i < stop_n+1; i++) {
for (int j = start_m; j < stop_m+1; j++) {
*(ptr++) = *((data + i*n) + j);
}
}
return out;
}
Hur var det man gjorde profilering i C hos Eclipse?