WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zahlen Sequenzen finden und nacheinander subtrahieren .txt

 

alejandro
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2014, 19:10     Titel: Zahlen Sequenzen finden und nacheinander subtrahieren .txt
  Antworten mit Zitat      
Liebe Matlab-Forum Mitglieder,

Ich bin gerade dabei einige .txt Dateien (zahlen) nacheinander einzulesen. Die Dateien haben jeweils 3 spalten mit 50 Zahlen.

Input:
1 1 55
2 0 14
3 0 22
4 1 19
5 0 30
6 1 7
7 0 12
8 0 88
9 0 2
10 1 103

Einige Rechnungen habe ich bereits gemacht (sub, sum, mean usw.) nun möchte ich bestimmte Sequenzen (Blöcke) herauslesen und subtrahiert.
Beispiel: Wenn zwei Nullen nacheinander (wie in Zeile 2 und 3 oder in Zeile 7 und 8 und 8 und 9) vorkommen soll (3 minus 2, 8 minus 7 und 9 minus Cool gerechnet werden.

Output:
1 8
2 76
3 86

Ich hoffe ihr könnt mir helfen. Kriege die for und if Schleifen nicht richtig aufeinander abgestimmt.

Grüße
Alexander
Private Nachricht senden Benutzer-Profile anzeigen


alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2014, 13:09     Titel: Find function
  Antworten mit Zitat      
Habe es mit der funktion find versucht kriege aber so nicht zwei nacheinander folgende Nullen sonder er zeigt mir nur eine null an...wie kriege ich es hin das er mir zwei Nullen auflistet und die passende zahl dazu?

Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.12.2014, 15:07     Titel:
  Antworten mit Zitat      
Hallo,

Code:
idx = find(in(1:end-1, 2) == 0 & diff(in(:,2)) == 0);
out = [in(idx, 1), in(idx+1,3) - in(idx,3)]


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2014, 18:13     Titel: Weitere Abfolgen...
  Antworten mit Zitat      
Hallo Harald,

Habe deinen code jetzt verwendet und eingebaut. Musste das ganze erst einmal verstehen und einbauen. Ich habe jetzt ein paar Dinge modifiziert:

Code:
% 0 0 --> 0 – 0

idx = find(in(1:end-1, 2) == 0 & diff(in(:,2)) == 0);
out = [in(idx, 1), in(idx+1,3) - in(idx,3)];

% 0 1 --> 1 – 0

idx1 = find(in(1:end-1, 2) == 0 & diff(in(:,2)) == 1);
out1 = [in(idx1, 1), in(idx1+1,3) - in(idx1,3)];

% 0 X  --> X – 0

idx2 = find(in(1:end-1, 2) == 0 & diff(in(:,1)) == 1);
out2 = [in(idx2, 1), in(idx2+1,3) - in(idx2,3)];

% 0 *0* X  --> X – *0*

%???
%???
 


Wie wandel ich deinen vorgegebenen Code nun ab damit ich Abfolgen wie 0 *0* X (X steht für "egal" ob 1 oder 0) finde und X mit der zweiten Null substrahieren kann?

Vielen Dank für deine Hilfe!

Grüße

Alex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.12.2014, 20:32     Titel:
  Antworten mit Zitat      
Hallo,

für die Verallgemeinerung ist es wohl einfacher, wenn du den Index verschiebst statt Differenzen zu betrachten, also z.B.

Code:
idx = find(in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & in(3:end,2) ~= 0);

Mit dem Index kannst du dann wie gewohnt weiterarbeiten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.12.2014, 15:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

Vielen Dank für deine zweite Antwort.

Ich habe jetzt folgende Sequenzen berechnen lassen und würde jetzt gerne noch weitere "Unabhängige" Abfolgen berechnen lassen. Momentan sind die 4 parameter "Abhängig" also enden egal wenn eine 0 oder eine 1 vorkommt. Gerne würde ich diese Sequenzen enden lassen unabhängig ob eine 0 oder 1 als letztes Element vorkommt.

0X Also: eine 0 danach eine 1 oder eine 0
00X Also: zwei 0 danach eine 1 oder eine 0
000X Also: drei 0 danach eine 1 oder eine 0
0000X Also: vier 0 danach eine 1 oder eine 0

X steht für 1 oder 0

Ich hoffe du verstehst mich.

Vielen Dank für deine Mühe! Das Forum war/ist mir eine große Hilfe.

Grüße aus Freiburg

Alexander

Code:
%##########################################################################

%%%%%% Abhängige Parameter

% ab_parameter_a_00    [0 0]      0_1 0_2 --> 0_2 – 0_1
% ab_parameter_b_01    [0 1]      0_1 1_2 --> 1_2 – 0_1
% ab_parameter_c_000    [0 0 0]   0_1 0_2 0_3 --> 0_3 – 0_2
% ab_parameter_d_001    [0 0 1]   0_1 0_2 0_3 --> 0_3 – 0_2

% ab_parameter_a_00 [0 0]  
idx = find(in(1:end-1, 2) == 0 & diff(in(:,2)) == 0);
ab_parameter_a_00 = [in(idx, 1), in(idx+1,3) - in(idx,3)];

% ab_parameter_b_01    [0 1]
idx1 = find(in(1:end-1, 2) == 0 & diff(in(:,2)) == 1);
ab_parameter_b_01 = [in(idx1, 1), in(idx1+1,3) - in(idx1,3)];

% ab_parameter_c_000    [0 0 0]
idx2 = find(in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & in(3:end,2) ~= 1);
ab_parameter_c_000 = [in(idx2, 1), in(idx2+2,3) - in(idx2+1,3)];

% ab_parameter_d_001    [0 0 1]
idx3 = find(in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & in(3:end,2) ~= 0);
ab_parameter_d_001 = [in(idx3, 1), in(idx3+2,3) - in(idx3+1,3)];
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.12.2014, 16:07     Titel:
  Antworten mit Zitat      
Hallo,

wenn dich das letzte Element gar nicht interessiert, dann kannst du die diesbezügliche Abfrage einfach weglassen.

Wenn es wirklich genau 1 oder 0 sein soll, dann

Code:
idx = find( in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & (in(3:end,2) == 0 | in(3:end,2) == 1) );


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2014, 19:50     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke hat super geklappt habe jetzt die gesamten "Abfolgen" berechnen lassen und will sie nun in eine .txt Datei mit den berechnete abfolgen nebeneinander schreiben lassen.

also:

ab_parameter_a_00 ab_parameter_b_01 ab_parameter_c_000 ...


Da die einzelnen variablen double array´s sind und unterschiedliche länge haben kriege ich immer wieder die Fehlermeldung das sie nicht die gleiche länge haben (was auch stimmt). Writetable kann ich in meiner matlab Version auch nicht verwenden (das wäre natürlich super).

Wie kann ich die "parameter" in ein array nebeneinander schreiben lassen? Untereinander ist kein Problem...Wink

Vielen Dank im voraus!

Grüße

Alexander

Code sieht so aus:

Code:
f = dir('*.txt');

for i = 1:length(f)

    filename = f(i,1).name;
    disp(['Lese Datei   ' filename])
   
in = dlmread(filename);

%%
%##########################################################################
%%%%%% Abhängige Parameter

% ab_parameter_a_00    [0 0]      0_1 0_2 ? 0_2 – 0_1
% ab_parameter_b_01    [0 1]      0_1 1_2 ? 1_2 – 0_1
% ab_parameter_c_000    [0 0 0]   0_1 0_2 0_3 ? 0_3 – 0_2
% ab_parameter_d_001    [0 0 1]   0_1 0_2 0_3 ? 0_3 – 0_2

% ab_parameter_a_00 [0 0]  
idx = find(in(1:end-1, 2) == 0 & diff(in(:,2)) == 0);
ab_parameter_a_00 = [in(idx, 1), in(idx+1,3) - in(idx,3)];

% ab_parameter_b_01    [0 1]
idx1 = find(in(1:end-1, 2) == 0 & diff(in(:,2)) == 1);
ab_parameter_b_01 = [in(idx1, 1), in(idx1+1,3) - in(idx1,3)];

% ab_parameter_c_000    [0 0 0]
idx2 = find(in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & in(3:end,2) ~= 1);
ab_parameter_c_000 = [in(idx2, 1), in(idx2+2,3) - in(idx2+1,3)];

% ab_parameter_d_001    [0 0 1]
idx3 = find(in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & in(3:end,2) ~= 0);
ab_parameter_d_001 = [in(idx3, 1), in(idx3+2,3) - in(idx3+1,3)];
%%
%##########################################################################
%%%%%% Unabhängige Parameter

% un_parameter_a_0X    [0 X]      0_1 0_2 ? 0_2 – 0_1
% un_parameter_b_00X    [0 0 X]     0_1 0_2 0_3 ? 0_3 – 0_2
% un_parameter_c_000X    [0 0 0 X]   0_1 0_2 0_3 ? 0_3 – 0_2

% un_parameter_a_0X    [0 X]
idx4 = find( in(1:end-2, 2) == 0 & (in(3:end,2) == 0 | in(3:end,2) == 1) );  
ab_parameter_a_0X = [in(idx4, 1), in(idx4+2,3) - in(idx4+1,3)];

% un_parameter_b_00X    [0 0 X]
idx5 = find( in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & (in(3:end,2) == 0 | in(3:end,2) == 1) );  
ab_parameter_b_00X = [in(idx5, 1), in(idx5+2,3) - in(idx5+1,3)];

% un_parameter_b_000X    [0 0 0 X]
idx6 = find( in(1:end-2, 2) == 0 & in(2:end-1,2) == 0 & in(3:end,2) == 0 & (in(3:end,2) == 0 | in(3:end,2) == 1) );  
ab_parameter_c_000X = [in(idx6, 1), in(idx6+3,3) - in(idx6+2,3)];
%%



end

fclose('all');
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.12.2014, 21:59     Titel:
  Antworten mit Zitat      
Hallo,

wie soll das "nebeneinander" bei den unterschiedlichen Längen denn aussehen?
Anders gefragt: was soll an den nicht belegten Stellen stehen?
Wenn du dir die zweite Frage beantwortet hast: Matrix mit diesem Wert vorbelegen und dann spaltenweise befüllen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2014, 12:43     Titel:
  Antworten mit Zitat      
Hallo,

An die nicht belegten Stellen könnten Nullen.

Habe versucht mit der preallocate function die arrays vorher mit Nullen voll zu schreiben. Allerdings gelingt es mir nicht dann eine variable "einzusetzen" und das eben auf den nicht belegten Stellen die Nullen stehen bleiben.

Könntest du mir ein Beispiel geben wie ich z.b. in

zeros(50,2)

variable x (14x2 double) einsetze:

4 -50
7 129,700000000000
8 188
9 58,5083333000000
10 58,5083334000000
18 58,5083333000000
19 58,5083334000000
27 58,5083330000000
30 58,5083330000000
31 58,5083340000001
32 58,5083330000000
33 58,5083330000000
41 58,5083330000002
42 58,5083329999998


und folgendes rauskommt:

4 -50
7 129,700000000000
8 188
9 58,5083333000000
10 58,5083334000000
18 58,5083333000000
19 58,5083334000000
27 58,5083330000000
30 58,5083330000000
31 58,5083340000001
32 58,5083330000000
33 58,5083330000000
41 58,5083330000002
42 58,5083329999998
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0

Habe jetzt schon einiges probiert...aber kriege es nicht befüllt bzw. immer wieder durch die nullen ersetzt Razz.

Danke

Alexander
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex4456
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2014, 12:59     Titel:
  Antworten mit Zitat      
Hallo

konnte zwar nicht alles überblicken, aber folgendes sollte helfen

Code:
b = zeros(50,2);
a = rand(2,2)
findindex = find(b(:,1) == 0,1);
b(findindex:findindex+size(a,1)-1,:) = a;


vielleicht ein bisschen umständlich für Anfänger.
Im Prinzip mit
Code:
b = zeros(50,2);
a = ones(5,2);
b(1:5,:) = a;
% oder
b([1 2 3 4 5],:) = a;
 


Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2014, 14:09     Titel:
  Antworten mit Zitat      
Hallo Alex,

Ja, habe ich verstanden aber was ist, wenn ich die größe von a nicht immer vorher weiß?

Klar ich setze a in b ein aber dafür muss man in deinem zweiten code beispiel wissen wie groß a ist.

Hoffe du verstehst mich?!

Danke!

Grüße

Alexander
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.12.2014, 14:21     Titel:
  Antworten mit Zitat      
Dann wäre es nach dem Bsp. von Alex4456

Code:

b = zeros(50,2);
a = ones(5,2); % <- nur ein Bsp. für a
 
b(1:size(a,1),:) = a;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2014, 14:27     Titel:
  Antworten mit Zitat      
Ok mit size hatte ich es probiert nur war meine Schreibweise falsch!

Vielen Dank für die schnellen Antworten von Alex4456 DSP und Harald!

Grüße

Alexander
Private Nachricht senden Benutzer-Profile anzeigen
 
alejandro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 13:57     Titel:
  Antworten mit Zitat      
Hallo,

Ich versuche gerade mit der find Funktion folgendes zu lösen:

Ich muss den Mittelwert aus einem bestimmten Spalten Bereich berechnen. Der Anfang des Bereichs kann zwischen der Zahl 1 und 50 beginnen und endet zwischen der Zahl 1 bis 50.

Am Beispiel sind die Bereiche folgendermaßen:
Bereich 1: 1-8
Bereich 2: 24-50
Bereich 3: 1-44
Bereich 4: 8-50
Bereich 5: 49

A B Mittelwerte
1 12 32
3 14
8 18
24 55 65.5
50 21
1 54 141
5 80
33 5
44 8
8 77 126.5
50 99
49 100 100
… … …


Wie kann ich diese "Bereiche" finden und den Mittelwert für den jeweiligen "Bereiche" berechnen lassen? Kann ich für die find Function einen "Range" angeben also das er Zahlen zwischen 1 und 50 finden soll?

Habe eine Datei mit den echten Daten angehängt.

Vielen Dank für die Hilfe (Ich hoffe man versteht meine Frage).

Grüße

Alexander

data1.txt
 Beschreibung:

Download
 Dateiname:  data1.txt
 Dateigröße:  52.26 KB
 Heruntergeladen:  413 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.