Extraction

- - Dernière réponse : Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
- 20 févr. 2017 à 17:23
Bonjour,
Je veut faire une extraction des vecteurs a partir d’une matrice binaire lorsque je fait la somme de ces vecteurs on trouve un vecteur ones je fais le programme mais est ce qu’ il y a une truque dans matlab fait sa parce que lorsque la matrice est grandis les boucle prendre un temps assez bien lent
Exemple :
M= 1 1 0 0 0
0 0 1 1 0
1 0 0 1 0
0 0 0 1 0
1 01 01
………………..la matrice contient 20 vecteurs. On prendre quatre vecteurs a chaque fois et on fais la somme V=[1 1 1 1 1 ]
je veut converti nombre binaire a>12 c-a-d 1000111010100 a décimal avec la fonction
function BinToInt(Value: string): Integer;
var
i, iValueSize: Integer;
begin
Result := 0;
iValueSize := length(value);
for i := 1 to iValueSize do
if Value[i] = '1' then Result := Result + (1 shl (iValueSize - i));
end;
elle marche mais le nombre binaire lorsque a >12 élément on a une erreur
Afficher la suite 

Votre réponse

3 réponses

Messages postés
175
Date d'inscription
samedi 15 novembre 2003
Statut
Membre
Dernière intervention
12 mai 2019
5
0
Merci
salut
essais plutôt
for i := 0 to Length(value) -1 do
Commenter la réponse de papyvore
Messages postés
693
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
0
Merci
Salut
Il me semble que la question est déjà traitée dans la question précédente (voir réponse de CIREC)
Papyvore par contre a tout à fait raison !
Commenter la réponse de dubois77
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
32
0
Merci
Aïe, ouille,

salut
essais plutôt
for i := 0 to Length(value) -1 do


Value est de type string et donc le premier caractère se trouve bien à l'index "[1]" ;)

Il me semble que la question est déjà traitée dans la question précédente (voir réponse de CIREC)

la question précédente, même si il n'a pas encore répondu, traite, elle de l'opération inverse ;)

pour le soucis ici je te propose d'abandonner le décalage avec "shl" qui est limité à un 32Bits (Integer) par un calcule simple mais qui permet d'aller jusqu'au limite d'un 64Bits (Int64)
soit 2^63-1 = 9223372036854775807
qui donne un binaire de 63 Digits = '111111111111111111111111111111111111111111111111111111111111111'

le code:
function PowerInt(const Base, Exponent: Integer): Int64;
var
  I            : Integer;
begin
  Result := 1;
  for I := 1 to Exponent do
    Result := Result * Base
end;

function BinToInt(Value: string): Int64;
var
  i, iValueSize: Integer;
begin
  Result := 0;
  iValueSize := length(value);
  for i := 1 to iValueSize do
    if Value[i] = '1' then
      Result := Result + PowerInt(2, iValueSize - i);
end;



et pour tester:
begin
  // représente High(Int64) en Binaire
  Caption := IntToStr(BinToInt('111111111111111111111111111111111111111111111111111111111111111'));
end;


voilà,

au passage tu peux marquer comme résolu ici et sur la question précédente (si bien sûr c'est le cas)
Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
32 -
Commenter la réponse de Cirec