Hej! Det finns säkert bättre sätt, men jag skulle ha skapat en ny array utifrån värdena i den första, typ så här: Jo, det är sökt effekt men det verkar oändligt långsamt att hålla på o loopa sig igenom arrayer, eller blir det trots allt en snabb optimerad kopiering? Jag tycker att det går ganska slött till att börja med så att trycka in en extra ganska stor loop känns trist om det nu slöar ner... Med tanke på hur en array i allmänhet är lagrad så finns det väl i stort sett bara två möjliga optimeringar: > Men detta förutsätter så många saker att det i praktiken enbart är meningsfullt i mycket tunga sammanhang. Det är inte heller möjligt (rätta mig om jag har fel) att göra så här i C#. > Men detta förutsätter så många saker att det i praktiken enbart är meningsfullt i mycket tunga sammanhang. Det är inte heller möjligt (rätta mig om jag har fel) att göra så här i C#. > Men detta förutsätter så många saker att det i praktiken enbart är meningsfullt i mycket tunga sammanhang. Det är inte heller möjligt (rätta mig om jag har fel) att göra så här i C#. > Men detta förutsätter så många saker att det i praktiken enbart är meningsfullt i mycket tunga sammanhang. Det är inte heller möjligt (rätta mig om jag har fel) att göra så här i C#. Tack för era kommentarer! Jag skulle faktiskt nästan vilja påstå att eftersom att du vill behandla kolumnerna var för sig så har du gjort arrayen fel; det borde vara två kolumner med vardera 1024 istället. Då hade du sluppit kopieringsbiten. Jonas: Matlab gör det så själv i bakgrunden, på det sättet jag har beskrivit ovan. Grejen är bara att Matlab ju så att säga har koll på allt i Matlab, så det har de nog abstraherat bort ganska bra ändå. Ja matlab är kraftfullt men guckigt :)Array-hantering
Håller på o lär mig c# och undrar nu hur jag skall göra. Jag har en array med 1024 rader och 2 kolumner. Till en funktion vill jag skicka bara första kolumnen och i matlab skulle jag få det genom att skriva myArray(:,1) alternativt myArray(1:end,1). Hur gör jag i c#?
Har förvånande nog inte hittat något i en enda av de 3 böcker jag har i ämnet, alla visar hur man loopar igenom alla element eller plockar ut ett enda element...
/JonasSv: Array-hantering
string[] array2 = new string[1024];
for (int i = 0 ; i < array1.length ; i++)
{
array2[i] = array1[i][1];
}
Eller nåt liknande om jag nu inte fattat helt fel...Sv:Array-hantering
Andra förslag eller kommentarer om snabbheten i loopar?
/JonasSv: Array-hantering
1. Om man vill ha en rad av det "lägsta indexet", så skulle man kunna ge pekaren m[i], om du har en array m[a][b], (med C-konvention). Det skulle då i stort sett alla interface kunna klara av utan större problem. (motsvarande med m[i][j] för en m[a][b][c]-array)
2. Om du inte vill ha det lägsta indexet, eller har en array som inte lagras på det sättet, har du bara en möjlighet. Du får skicka första pekaren, och sen en förklaring på hur mottagaren ska veta vilken "nästa" är.
I princip skulle du då i C kunna göra:
int m[a][b][c];
void f(int ***m, int offset);
for(; m < max; m+=offset)
gör grejer
Men detta förutsätter så många saker att det i praktiken enbart är meningsfullt i mycket tunga sammanhang. Det är inte heller möjligt (rätta mig om jag har fel) att göra så här i C#.
Om ditt fall är så tungt kan du istället använda dig av en endimensionell vektor, och själv hålla reda på vilket index som motsvarar vilken punkt.Sv:Array-hantering
Jag är lite inne på din kod; att leka med pekare i c# går hur bra som helst, dock omöjligt i vb.net. Man måste dock sätta det i ett unsafe-block då saker kan gå åt skogen... Det förutsätter nog antagligen dock att arrayen är deklarerad som [1024,2] och inte [1024][2] då det senare innebär att det finns 1024 element i första arrayen som var och en innehåller en array med två element. (Då det i senare fall innebär att man inte har en aning om var underarrayerna faktiskt finns i minnet. I det första fallet är det "bara" en endimensionell array som har maskerats till att vara tvådimensionell)Sv:Array-hantering
Jag är lite inne på din kod; att leka med pekare i c# går hur bra som helst, dock omöjligt i vb.net. Man måste dock sätta det i ett unsafe-block då saker kan gå åt skogen... Det förutsätter nog antagligen dock att arrayen är deklarerad som [1024,2] och inte [1024][2] då det senare innebär att det finns 1024 element i första arrayen som var och en innehåller en array med två element. (Då det i senare fall innebär att man inte har en aning om var underarrayerna faktiskt finns i minnet. I det första fallet är det "bara" en endimensionell array som har maskerats till att vara tvådimensionell)Sv:Array-hantering
Jag är lite inne på din kod; att leka med pekare i c# går hur bra som helst, dock omöjligt i vb.net. Man måste dock sätta det i ett unsafe-block då saker kan gå åt skogen... Det förutsätter nog antagligen dock att arrayen är deklarerad som [1024,2] och inte [1024][2] då det senare innebär att det finns 1024 element i första arrayen som var och en innehåller en array med två element. (Då det i senare fall innebär att man inte har en aning om var underarrayerna faktiskt finns i minnet. I det första fallet är det "bara" en endimensionell array som har maskerats till att vara tvådimensionell)Sv:Array-hantering
Jag är lite inne på din kod; att leka med pekare i c# går hur bra som helst, dock omöjligt i vb.net. Man måste dock sätta det i ett unsafe-block då saker kan gå åt skogen... Det förutsätter nog antagligen dock att arrayen är deklarerad som [1024,2] och inte [1024][2] då det senare innebär att det finns 1024 element i första arrayen som var och en innehåller en array med två element. (Då det i senare fall innebär att man inte har en aning om var underarrayerna faktiskt finns i minnet. I det första fallet är det "bara" en endimensionell array som har maskerats till att vara tvådimensionell)Sv: Array-hantering
Efter moget övervägande inser jag att jag aldrig kommer att behöva ta hänsyn till fler än just två kolumner och kan lika gärna skapa en en dimensionell vektor för vardera kanal. Den mottagande funktionen (en fft) vill ha en vektor och som matlab-kung så ville jag på sedvanligt enkelt sätt och med enkel syntax skicka in först den ena kolumnen och sedan den andra som om det vore vektorer redan. Jag är fortfarande förvånad att det skall behövas böka så mycket för lite grundläggande array-hantering! Men å andra sidan så är matlab ett scriptspråk så i bakgrunden görs kanske alla dessa loopar och pekar-historier...
Tack igen!
/JonasSv:Array-hantering
Sv:Array-hantering
Kort sagt, det finns inget annat sätt att göra det på snabbt, Matlab har gjort så. (förutom sparse-matriser, men det är ju en annan historia)
Men då ska man ju ha i åtanke att Matlab hör till kategorin "tunga sammanhang". Det är rejäla operationer som görs, och allt är optimerat nästan in absurdum, utom gränssnittet. (Eller vad sägs om Java med en helt egen objekthierarki på allt i programmet...)
Du skulle kunna lösa det genom att helt enkelt skriva en egen wrapper i matlab som tar emot hela matrisen och gör om den till en vektor.
Oskar: Det beror ju på. Dels är det ganska vanligt i allmänhet att arbeta med matriser mot matlab (och i synnerhet fft när man har tvådimensionella grejer).
Dels kan det ju vara konceptuellt rätt att ha det på det viset.Sv: Array-hantering
Vad jag håller på med är att lära mig C# och med målet att läsa in en wav-fil och sedan göra lite spektralanalyser för att sedan gå vidare till att sampla från line-in på ljudkort och bygga en generell eller speciell avkodare. Att läsa in fil och rita wav-filens höger och vänster går bra och att ta en del och göra fft på verkar gå men jag har precis börjat nosa på Exocortex.DSP-paketet. Är lite för rostig för att skapa mig en egen FFT-klass. Så långsamt men säkert pillar jag mig närmare mitt mål.
Tack för värdefulla kommentarer!
/Jonas