Je suis confronté à un problème dans les éléments correspondants dans 2 matrices. Le premier élément peut être apparié en utilisant ismember
mais le second élément doit être dans une plage. S'il vous plaît voir l'exemple ci-dessous:correspondance ID + trouver un nombre dans une matrice dans Matlab
% col1 is integerID, col2 is a number. -->col1 is Countrycode, col2 is date
bigmat = [ 600 2
600 4
800 1
800 5
900 1] ;
% col1 is integerID, col2 is VALUE, col2 is a range -->value is Exchange rate
datamat = {...
50 0.1 [2 3 4 5 6] % 2:6
50 0.2 [9 10 11] % 9:11
600 0.01 [1 2 3 4] % 1:4
600 0.2 [8 9 10] % 8:10
800 0.12 [1] % 1:1
800 0.13 [3 4] % 3:4
900 0.15 [1 2] } ; % 1:2
I need the answer as:
ansmat = [ 600 2 0.01
600 4 0.01
800 1 0.12
800 5 nan % even deleting this row is fine
930 1 0.15 ] ;
Pour simplifier:
- Tous les intIDs de matrix_1 existent dans matrix_2.
- Les chiffres de la plage sont des dates! Dans une plage, ces nombres sont consécutifs: [1 2 ... 5]
- Pour tout ID, les dates de la ligne suivante ne sont pas continues. Par exemple, vous pouvez voir [1 2 3 4] puis [8 9 10] dans la rangée suivante.
bigmat est une énorme matrice! 300,000-500,000 lignes et donc un code vectorisé serait apprécié. datamat est d'environ 5000 lignes ou moins. Vous pouvez convertir la cellule en matrice. Pour chaque rangée, j'ai le minimum et le maximum. La colonne 3 est minimum: maximum. Merci!
Merci Amro ..mais la boucle For prend beaucoup de temps. J'essaie de voir si je peux utiliser une approche vectorisée. Pour la troisième colonne de datamat, j'ai déjà les valeurs minimum et maximum en tant que colonnes séparées. Je ne suis pas sûr de pouvoir les utiliser pour accélérer le code. Merci. – Maddy
@Maddy: Ok vous avez raison, je l'ai juste testé avec des données aléatoires de la même taille que vous décrivez (300K et 5K), et cela a pris comme 70 secondes .. Aussi pour le min/max, vous pouvez directement les utiliser "M" à la place, mais je doute que cela fasse une énorme différence. Je vais essayer encore et voir si je peux améliorer le temps, donc restez à l'écoute;) – Amro