2009-08-15 9 views
1

Dans un (m par n) tableau stocké comme double *d (colonne principale), ce qui est le moyen le plus rapide de la sélection d'une plage de lignes et ou colonnes:Comment trouver un sous-ensemble d'un tableau 2d en sélectionnant des lignes et des colonnes dans c?

double *filter(double *mat, int m, int n, int rows[], int cols[]); 

invoqué comme:

double *B; 
int rows[]= {1,3,5}; int cols[]={2,4}; 
B = filter(A, 5, 4, rows, cols); 

qui est prévu pour retourner un sous-ensemble de 3 par 2 de A composé d'éléments (1,2), (1,4), (3,2) ...

+0

On dirait des devoirs pour moi. – hirschhornsalz

+1

Qu'entendez-vous par «plus rapide»? Voulez-vous dire «plus rapide à mettre en œuvre», «plus rapide à compiler» ou «plus rapide à exécuter»? Très probablement, vous voulez dire le dernier, auquel cas la réponse est: essayez différentes techniques et profilez chacune pour votre plate-forme cible. De la façon dont vous l'avez codé, filter() devra allouer de la mémoire, donc votre API n'est pas idéale pour les performances d'exécution. - William Pursell il ya 0 secondes [Supprimer ce commentaire] –

Répondre

0

Je suis assez sûr que m et n devrait être la dimension du nouveau tableau (c.-à-d. m devrait être le nombre d'éléments de rows et n devrait être le nombre d'éléments dans les colonnes) et non la dimension du tableau source comme cela semble être le cas dans votre exemple parce que a) vous n'avez pas besoin de connaître la dimension de le tableau source si vous savez déjà quels indices en choisir (et sont supposés pouvoir supposer que ceux-ci seront valides) et b) si vous ne connaissez pas la taille de rows et columns ils sont inutiles car vous ne pouvez pas itérer au dessus d'eux.

donc dans cette hypothèse l'algorithme pourrait ressembler à ceci:

  • mémoire pour un Allouer tableau MXN
  • Pour chaque i 0..m, j 0..n
    • B[i,j] = A[ rows[i], cols[j] ];
+0

de bons points. m & n sont les dimensions de la matrice source. L'interface a besoin de longueur (lignes) et de longueur (cols). Dans ce cas, m & n ne sont pas nécessaires. Je suis habitué à fortran où vous pouvez passer un vecteur d'entiers. Mon intention avec l'interface était de copier ith colonne en utilisant quelque chose comme memcpy ((i * n), (i * n), n * sizeof (double)), puis les lignes sont bouclées en utilisant l'index linéaire. Cela nécessiterait un tableau temporaire. Votre approche est directe et facile. Je ne sais pas qui sera le plus rapide. Finira le profilage. Merci. – user151410

1

c fournit pas native support pour cela, donc vous devrez trouver une bibliothèque qui le supporte, ou le définir à la main.

pseudocode:

a=length of rows  // no built in c functionality for this either, 
b=length of cols  // use a sentinel, or pass to the function 
nmat = allocate (sizeof(double)*a*b) on the heap 
for (i=0; i<a; ++i) 
    for (j=0; j<b; ++j) 
     // Note the column major storage convention here (bloody FORTRAN!) 
     nmat[i + j*b] = mat[ rows[i] + cols[j]*n ]; 
return nmat 
// caller responsible for freeing the allocated memeory 

J'ai commenté les deux grands problèmes que vous rencontrez.

+0

merci. J'avais peur de ça. Fortran a ses avantages - mais c est appelé ici. soupir! – user151410

Questions connexes