Sida 1 av 1

Bra matris definition

Postat: 13 februari 2012, 10:13:19
av Korken
Godagens!

Jag håller på och krigar lite med min matrisinverskod och märkte snabbt att jag behövde en bra definition av matriser.
Det som är lite problem är att jag har matriser av många olika storlekar och då så vill jag kunna skapa mina definitioner dynamiskt för att spara minne.

Tex (funkar inte, men visar vad jag vill):

Kod: Markera allt

typedef struct 
{
    int rows, cols;
    float mat[][];
} matrix_data;

matrix_data Matris = new matrix_data(10, 5); // 10 rows, 5 cols - Någon bra funktion som skapar min matrisstruktur med en array = mat[10][5]
Finns det något sätt att skapa variabler på detta sätt? Så när den allokerar plats på stacken så tar den bara precis så mycket som behövs.
Hur kan jag annars uppnå samma resultat?

Mvh
Emil

Re: Bra matris definition

Postat: 13 februari 2012, 10:23:14
av Icecap
* Pratar vi PIC, AVR, P3 eller vad?
* Varför ska du snåla på minnet? Är det plats att köra dessa matriser finns det ju plats...
* Är det en µC är dynamisk minnesallokering oftast ganska förfelat! Det tar mer än det ger och en bättre lösning kan vara att allokera plats för de olika storlekar matriser ovanpå varandra om de inte ska samexistera. Jag brukar oftast använda "union" och då baka in en byte-mässig buffer samt olika definitioner på samma minnesplats, då används minnesplatsen optimalt.

Ska du t.ex. ha valfri storlek kan du göra:

Kod: Markera allt

union
  {
  float S_3x3 [3][3];
  float S_4x4 [4][4];
  ... osv.
  } Matrix;

Re: Bra matris definition

Postat: 13 februari 2012, 10:30:33
av Korken
* I detta fall så pratar vi om en STM32F405, en Cotex-M4 baserad MCU med FPU och DSP samt 1Mb Flash och 192kB SRAM.
* Det är ett par kB som försvinner i dödutrymme (ca 2Kb). Just nu är detta inte ett problem, men när fler funktioner läggs upp så kan det komma att behövas. Jag gillar att vara förberedd.

Skulle du kunna förklara ditt exempel lite närmre? Jag hänger inte riktigt med just nu. :)

Re: Bra matris definition

Postat: 13 februari 2012, 10:52:04
av Icecap
Om vi antar att du behöver att göra beräkningar med en matrix och vill ha plats kan en union vara saken.

I mitt exempel kommer du åt matrixen på 4x4 vid att använda "matrix.S_4x4[][]", vill du jobba med 3x3-matrixen använder du "Matrix.S_3x3[][]". Såklart kan du lägg in vilka värden/storlekar du vill, grejen är att de alla ligger på samma minnesplats! Läs på lite om 'union'.

Detta sätt är dock inte alltid rätt lösning men den är det väldigt ofta.

Re: Bra matris definition

Postat: 13 februari 2012, 11:15:51
av Korken
Okej, nu börjar jag hänga med. Det jag då gör är en struktur med union i, där unionen får definiera upp min matris.
Ska testa detta och se vad som händer. :) Tack för hjälpen!

Re: Bra matris definition

Postat: 13 februari 2012, 11:22:07
av Icecap
Kom bara ihåg att minnesarean bara kan användas av en rutin åt gången! Du kan alltså inte spara två olika matrixer i den samtidig - men du kan reservera plats åt upp-till-den-största och då inte använda mer minne även om du kan ha en uppsjö olika variationer "inuti" samma minnesarea.