Springen naar inhoud

Matlab: enen tellen


  • Log in om te kunnen reageren

#1

Merien

    Merien


  • >100 berichten
  • 124 berichten
  • Ervaren gebruiker

Geplaatst op 03 september 2008 - 15:59

The case:
[codebox]b(1,: )=[0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1][/codebox]

Tel de enen in de verschillende groepen en laat ze weergeven in vector b(2,:P of waar je wilt.

Het resultaat zou zoiets moeten zijn:
[codebox]b(2,: )=[0 0 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 5][/codebox]
De volgorde of het aantal nullen doet er niet zoveel toe aangezien ik de uitkomsten (11 en 5 in dit geval) uiteindelijk wil middelen.

Van alles geprobeerd, maar mijn ideeen zijn op :D

Veranderd door Merien, 03 september 2008 - 16:01


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

physicalattraction

    physicalattraction


  • >1k berichten
  • 3102 berichten
  • Moderator

Geplaatst op 03 september 2008 - 16:57

Ik heb het gevoel dat het volgende voorbeeld niet het meest elegante voorbeeld is, maar wel moet werken.

[codebox]X = 0;
Y = b(1,:D;
countones = 0;
countgroups = 1;
for i = 1:length(Y)
if Y(i) = 1;
countones = countones + 1;
else
if countones>0
X(countgroups) = countones;
countones = 0;
end
end
end
if Y(end) = 1
X(contgroups) = countones;
end[/codebox]

De laatste if statement is om ervoor te zorgen dat je de laatste groep ook meetelt. Die smiley is dus een dubbele punt met een haakje sluiten er achter.

#3

dirkwb

    dirkwb


  • >1k berichten
  • 4172 berichten
  • Moderator

Geplaatst op 03 september 2008 - 18:31

Stel dat jouw vector b heet. Gebruik: sum( (b>0)) (let op de haken)
Quitters never win and winners never quit.

#4

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 03 september 2008 - 18:53

Als ik het goed begrijp wil je het aantal opeenvolgende 1-en weten (en dus niet het totaal aantal 1-en in een rij zoals dirk doet).

Ik ga er even van uit dat er alleen 1-en en 0-en in de rij zitten.

function uitVector = eenentellen(inVector)
% inVector is de vector met de eenen. In jouw geval b(1,:)
% uitVector is de vector met de uitwaarden. In jouw geval b(2, :)

% We moeten eerst het begin en eindpunt van een opeenvolgende serie 1-en te vinden.
% Dit kun je het beste doen met een soort afgeleide door te kijken naar het verschil tussen x(i) en x(i+1):
verschil = inVector(2:end) - inVector(1:end-1);



% vind nu de begin indices van de 1-en
beginIndices = find(verschil > 0) + 1;

% Als het eerste getal in de serie een 1 is, dan moet die ook nog mee worden genomen in de beginIndices
if inVector(1) > 0
	beginIndices = [1 beginIndices];
end



% Zelfde verhaal voor de eindindices
eindIndices = find(verschil < 0);

if inVector(end) > 0
	eindIndices(end+1) = length(inVector);
end


% Nu is het een kwestie het verschil tussen de begin indices en eind
% indices te tellen en deze in een nieuwe vector te plaatsen

% vector alloceren
uitVector = zeros(size(inVector));

uitVector(eindIndices) = eindIndices - beginIndices + 1;

end

Nu is het een kwestie van intikken

b(2, :) = eenentellen(b(1, :));
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#5

Merien

    Merien


  • >100 berichten
  • 124 berichten
  • Ervaren gebruiker

Geplaatst op 03 september 2008 - 18:56

Stel dat jouw vector b heet. Gebruik: sum( (b>0)) (let op de haken)

Dan krijg ik niet het antwoord dat ik wil weten hoor. Lees mijn vraag even goed.
Ik wil uiteindelijk de gemiddelde grootte weten van de clusters enen. Op jouw manier tel je gewoon de enen op :D

#6

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 03 september 2008 - 19:02

Dan krijg ik niet het antwoord dat ik wil weten hoor. Lees mijn vraag even goed.
Ik wil uiteindelijk de gemiddelde grootte weten van de clusters enen. Op jouw manier tel je gewoon de enen op :D


Heb jij mijn vorig bericht gezien?
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#7

Merien

    Merien


  • >100 berichten
  • 124 berichten
  • Ervaren gebruiker

Geplaatst op 03 september 2008 - 19:12

Heb jij mijn vorig bericht gezien?

Ja. Nadat ik mijn reactie had gepost.

#8

dirkwb

    dirkwb


  • >1k berichten
  • 4172 berichten
  • Moderator

Geplaatst op 03 september 2008 - 19:36

Dan krijg ik niet het antwoord dat ik wil weten hoor. Lees mijn vraag even goed.
Ik wil uiteindelijk de gemiddelde grootte weten van de clusters enen. Op jouw manier tel je gewoon de enen op :P

Inderdaad ik las slecht :P , maar ja ik zag dat ik bart verderhielp (althans dat denk ik :D )

Veranderd door dirkwb, 03 september 2008 - 19:36

Quitters never win and winners never quit.

#9

oktagon

    oktagon


  • >1k berichten
  • 4502 berichten
  • Verbannen

Geplaatst op 03 september 2008 - 22:00

In 1980,toen ik me begon te verdiepen in computertaal en dus ook binaire getallen en meen ik me te herinneren,dat elke stap naar links een gewichtsfactor 2 is met toename van de exponent van 0 naar het aantal nullen en enen.

Dus bijv het binaire getal 1001001 stelt in werkelijkheid 26+ 0+0+23+0+0+20=...
Is -in deze topic-dit dus geen binair getal,waarbij dus het grootste getal van de enen overeenkomt met 223 en alle eropvolgende enen-behoudens tussenliggende nullen- een exp.lager en dat zootje bij elkaar optellen.

Maar door mutaties in de CT zullen er mogelijk veranderingen zijn opgetreden;na 1980 kreeg in het eerste orgel met lange wachttijden onder mijn tikgrage vingers!

#10

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 03 september 2008 - 22:43

Voor de lol:
b = [1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1];

for i = 2:1:size(b,2),
  if b(1,i) == 1,
	b(1,i) = b(1,i-1) + 1; 
	b(1,i-1) = 0;
  end
end

sum(b)/sum(b>0)

#11

physicalattraction

    physicalattraction


  • >1k berichten
  • 3102 berichten
  • Moderator

Geplaatst op 04 september 2008 - 08:17

EvilBro, je code kan nooit werken, daar je op die manier nooit b(1,1) checkt en je dus hiermee een fout kan maken.

#12

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 04 september 2008 - 09:54

EvilBro, je code kan nooit werken, daar je op die manier nooit b(1,1) checkt en je dus hiermee een fout kan maken.

Kun je een voorbeeld geven van een LaTeX die niet tot een juist antwoord leidt?

#13

Merien

    Merien


  • >100 berichten
  • 124 berichten
  • Ervaren gebruiker

Geplaatst op 04 september 2008 - 12:06

Ik heb het gevoel dat het volgende voorbeeld niet het meest elegante voorbeeld is, maar wel moet werken.

X = 0;Y = b(1,<img src='http://www.wetenschapsforum.nl/public/style_emoticons/<#EMO_DIR#>/icon_wink.gif' class='bbc_emoticon' alt=':P' />;countones = 0;countgroups = 1;for i = 1:length(Y)   if Y(i) = 1;      countones = countones + 1;   else      if countones>0         X(countgroups) = countones;         countones = 0;      end   endendif Y(end) = 1   X(contgroups) = countones;end

De laatste if statement is om ervoor te zorgen dat je de laatste groep ook meetelt. Die smiley is dus een dubbele punt met een haakje sluiten er achter.

Superbedankt! :P
Je was alleen wel vergeten de countgroups te laten doortellen. Als je hem op deze manier draait telt ie alleen de laatste groep elke keer, maar dat probleempje was vlug opgelost.

Sorry Bart, ik heb jouw idee uiteindelijk niet gebruikt omdat het me wat omslachtiger leek :D, maar toch ook bedankt voor het meedenken :D

Ik ga het nu ff implementeren voor een vector met een miljoen elementen, want dat was het uiteindelijke doel. :P

#14

physicalattraction

    physicalattraction


  • >1k berichten
  • 3102 berichten
  • Moderator

Geplaatst op 04 september 2008 - 12:13

@EvilBro: Je hebt gelijk, ik zag even over het hoofd dat je b(i) = b(i-1)+1 gedaan hebt, en dat daar dus inderdaad b(1) gecheckt wordt.

@Merien: Oeps, inderdaad nog een countgroups = countgroups + 1 erin zetten. Ook zie ik dat ik een typfout gemaakt had. Maar dat zijn allemaal fouten die je met een keer testen makkelijk er uit haalt.

#15

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 04 september 2008 - 12:23

Nog even uitleggen wat mijn methode doet: er worden steeds twee opvolgende elementen bekeken. Op het moment dat het tweede element een 1 is, wordt de volgende substitutie toegepast:
[ ... x 1 ...] -> [ ... 0 (x+1) ...]
Een keer de hele vector doorlopen en je hebt alle aaneengesloten 1-tjes opgeteld. Dan is het slechts nog een kwestie van even de totale som te delen door het aantal elementen dat ongelijk is aan nul.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures