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

cell Inhalte austauschen

 

Sandra91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 13:56     Titel: cell Inhalte austauschen
  Antworten mit Zitat      
Hallo zusammen, ich sitze nun schon eine ganze Weile an diesem Problem. Es geht um folgendes: Ich erstelle eine Liste (200 Zeilen und 2 Spalten). In jeder Zeile steht ein Simulink-Block Name und daneben erst einmal die Anzahl Null.
Code:
all_blks = blocknames; %alle Simulink-Blöcke
Nullen = num2cell(zeros(length(all_blks),1)); %init mit Null
Simulink_Liste = [all_blks Nullen]; %Liste erstellen


Nun durchsuche ich irgendein Modell und Zähle die Block-namen und die dazu gefundene Anzahl.

Code:
uniqueBlkTypes = unique(blkType); %Auflistung der gefundenen Block-Typen (Constant, Gain, Logic etc.)
anzahl_blocktypes = cellfun(@(x) sum(strcmp(x,blkType)), uniqueBlkTypes,'UniformOutput',false); %Anzahl der gefundenen Blocktypen
Typ_Anzahl = [ uniqueBlkTypes anzahl_blocktypes]; %gefundener Block-Typ und dazugehörige Anzahl daneben (x zeilen, 2 Spalten)


jetzt habe ich praktisch die cell 'Simulink_Liste' und die cell 'Typ_Anzahl'.

jetzt brauche ich eine Schleife, die mir die Anzahl der Blöcke an die richtige Stelle in der 'Simulink_Liste' schreibt. Mein Ansatz sieht bis jetzt folgendermaße aus:

Code:
for i = 1:length(Typ_Anzahl)
    Name = strcmp(all_blks,Typ_Anzahl{i}); %Bace_Liste (an der Stelle des gefundenen Block-Namens steht eine '1')
    suchen = find(Name,'1');  % Zeilennummer, in der Block-Typ steht
    old_number = sprintf('%f', Bace_Liste{suchen,2});
    new_number = sprintf('%f', Typ_Anzahl{i,2});
    wo = sprintf('%f', Bace_Liste{suchen,2});
    String_ersetzt = strrep(wo, old_number, new_number);
   
end


Mit dem strrep klappt es zwar so nach einigen Datentyp-Umwandlungen, aber ich möchte ja in der gesamten 'Simulink_Liste' die richtige Anzahl der gefunden Blöcke hinschreiben und nicht am Ende nur eine Null in eine z.B. 5 umwandeln. Die Liste muss am Ende komplett sein, also alle Block-Typen und daneben eben die Anzahl.

Ich hoffe irgendjemand kann mir hier weiterhelfen. Wäre wirklich super! Danke.


Sandra91

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 14:39     Titel: Re: cell Inhalte austauschen
  Antworten mit Zitat      
Sandra91 hat Folgendes geschrieben:
Hallo zusammen, ich sitze nun schon eine ganze Weile an diesem Problem. Es geht um folgendes: Ich erstelle eine Liste (200 Zeilen und 2 Spalten). In jeder Zeile steht ein Simulink-Block Name und daneben erst einmal die Anzahl Null.
Code:
all_blks = blocknames; %alle Simulink-Blöcke
Nullen = num2cell(zeros(length(all_blks),1)); %init mit Null
Simulink_Liste = [all_blks Nullen]; %Liste erstellen


Nun durchsuche ich irgendein Modell und Zähle die Block-namen und die dazu gefundene Anzahl.

Code:
uniqueBlkTypes = unique(blkType); %Auflistung der gefundenen Block-Typen (Constant, Gain, Logic etc.)
anzahl_blocktypes = cellfun(@(x) sum(strcmp(x,blkType)), uniqueBlkTypes,'UniformOutput',false); %Anzahl der gefundenen Blocktypen
Typ_Anzahl = [ uniqueBlkTypes anzahl_blocktypes]; %gefundener Block-Typ und dazugehörige Anzahl daneben (x zeilen, 2 Spalten)


jetzt habe ich praktisch die cell 'Simulink_Liste' und die cell 'Typ_Anzahl'.

jetzt brauche ich eine Schleife, die mir die Anzahl der Blöcke an die richtige Stelle in der 'Simulink_Liste' schreibt. Mein Ansatz sieht bis jetzt folgendermaße aus:

Code:
for i = 1:length(Typ_Anzahl)
    Name = strcmp(all_blks,Typ_Anzahl{i}); %Bace_Liste (an der Stelle des gefundenen Block-Namens steht eine '1')
    suchen = find(Name,'1');  % Zeilennummer, in der Block-Typ steht
    old_number = sprintf('%f', Simulink_Liste{suchen,2});
    new_number = sprintf('%f', Typ_Anzahl{i,2});
    wo = sprintf('%f', Bace_Liste{suchen,2});
    String_ersetzt = strrep(wo, old_number, new_number);
   
end


Mit dem strrep klappt es zwar so nach einigen Datentyp-Umwandlungen, aber ich möchte ja in der gesamten 'Simulink_Liste' die richtige Anzahl der gefunden Blöcke hinschreiben und nicht am Ende nur eine Null in eine z.B. 5 umwandeln. Die Liste muss am Ende komplett sein, also alle Block-Typen und daneben eben die Anzahl.

Ich hoffe irgendjemand kann mir hier weiterhelfen. Wäre wirklich super! Danke.
 
raule

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 15:04     Titel:
  Antworten mit Zitat      
Ich weiß nicht genau, ob ich dich richtig verstanden habe. Du hast im Endeffekt einen Anfangsvektor, der irgendwelche Strings enthält und willst in einem anderen Vektor gleicher Länge an jeder Stelle stehen haben, wie oft dieser String vorkommt?

Falls ja, sollte ein Wörterbuch/hash table die Sache vereinfachen:

Code:
types = {'foo', 'bar', 'foobar'}';
full_list = {'foo', 'bar', 'foo', 'foo', 'foobar', 'bar'}';
full_list_freq = NaN(numel(full_list), 1);
frequencies = cellfun(@(type) sum(strcmp(full_list, type)), types);
types_to_frequencies = containers.Map(types, frequencies);

for i = 1:numel(full_list)
    current_type = full_list{i};
    full_list_freq(i) = types_to_frequencies(current_type);
end
full_list, full_list_freq
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 15:25     Titel:
  Antworten mit Zitat      
raule hat Folgendes geschrieben:
Ich weiß nicht genau, ob ich dich richtig verstanden habe. Du hast im Endeffekt einen Anfangsvektor, der irgendwelche Strings enthält und willst in einem anderen Vektor gleicher Länge an jeder Stelle stehen haben, wie oft dieser String vorkommt?

Falls ja, sollte ein Wörterbuch/hash table die Sache vereinfachen:

Code:
types = {'foo', 'bar', 'foobar'}';
full_list = {'foo', 'bar', 'foo', 'foo', 'foobar', 'bar'}';
full_list_freq = NaN(numel(full_list), 1);
frequencies = cellfun(@(type) sum(strcmp(full_list, type)), types);
types_to_frequencies = containers.Map(types, frequencies);

for i = 1:numel(full_list)
    current_type = full_list{i};
    full_list_freq(i) = types_to_frequencies(current_type);
end
full_list, full_list_freq



hallo raule, nein nicht ganz. also ich habe zum Beispiel eine cell (5x2), die sieht so aus: 'Subsystem' [0]
'Inport' [0]
'Outport' [0]
'DiscreteFir' [0]
'TriggerPort' [0]

So, und jetzt hab durch suche ich per matlab-code irgendein Simulink-Modell und lasse mir die Anzahl und den Blocktyp der im Modell verwendeten Blöcke ausgeben. Das sieht dann z.B so aus: cell(2x2)
'Subsystem' [3]
'DiscreteFir' [2]
Es wurden also im Modell xy drei Subsysteme und zwei discreteFir gefunden.

Jetzt will die [3] und die [2] oben in die erste cell (7x2) anstatt der Null hinschreiben. Natürlich die 3 bei subsystem und die 2 bei discreteFir.
Soll dann so aussehen:
'Subsystem' [3]
'Inport' [0]
'Outport' [0]
'DiscreteFir' [2]
'TriggerPort' [0]

Ich habe es ja mit strrep schon versucht aber das will irgendwie nicht funktionieren. Ich kenne mich leider nicht sehr gut aus in Matlab.
danke für deine Hilfe.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 15:28     Titel:
  Antworten mit Zitat      
Anonymous hat Folgendes geschrieben:
raule hat Folgendes geschrieben:
Ich weiß nicht genau, ob ich dich richtig verstanden habe. Du hast im Endeffekt einen Anfangsvektor, der irgendwelche Strings enthält und willst in einem anderen Vektor gleicher Länge an jeder Stelle stehen haben, wie oft dieser String vorkommt?

Falls ja, sollte ein Wörterbuch/hash table die Sache vereinfachen:

Code:
types = {'foo', 'bar', 'foobar'}';
full_list = {'foo', 'bar', 'foo', 'foo', 'foobar', 'bar'}';
full_list_freq = NaN(numel(full_list), 1);
frequencies = cellfun(@(type) sum(strcmp(full_list, type)), types);
types_to_frequencies = containers.Map(types, frequencies);

for i = 1:numel(full_list)
    current_type = full_list{i};
    full_list_freq(i) = types_to_frequencies(current_type);
end
full_list, full_list_freq



hallo raule, nein nicht ganz. also ich habe zum Beispiel eine cell (5x2), die sieht so aus: 'Subsystem' [0]
'Inport' [0]
'Outport' [0]
'DiscreteFir' [0]
'TriggerPort' [0]

So, und jetzt hab durch suche ich per matlab-code irgendein Simulink-Modell und lasse mir die Anzahl und den Blocktyp der im Modell verwendeten Blöcke ausgeben. Das sieht dann z.B so aus: cell(2x2)
'Subsystem' [3]
'DiscreteFir' [2]
Es wurden also im Modell xy drei Subsysteme und zwei discreteFir gefunden.

Jetzt will die [3] und die [2] oben in die erste cell (7x2) anstatt der Null hinschreiben. Natürlich die 3 bei subsystem und die 2 bei discreteFir.
Soll dann so aussehen:
'Subsystem' [3]
'Inport' [0]
'Outport' [0]
'DiscreteFir' [2]
'TriggerPort' [0]

Ich habe es ja mit strrep schon versucht aber das will irgendwie nicht funktionieren. Ich kenne mich leider nicht sehr gut aus in Matlab.
danke für deine Hilfe.


sorry die untere cell ist dann natürlich auch 5x2 Smile
 
raule

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 15:43     Titel:
  Antworten mit Zitat      
Code:
block_array = {'Subsystem', 0; 'Inport', 0; 'Outport', 0; 'DiscreteFir', 0; 'TriggerPort', 0};
sub_array = {'Subsystem', 3; 'DiscreteFir', 2};
blocks_to_frequencies = containers.Map(sub_array(:,1), sub_array(:,2));

for i = 1:size(block_array, 1)
    current_block = block_array{i,1};
    try
        block_array{i,2} = blocks_to_frequencies(current_block);
    catch err
        if strcmp(err.identifier, 'MATLAB:Containers:Map:NoKey')
            continue
        else
            rethrow(err);
        end
    end
end
block_array
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2013, 16:02     Titel:
  Antworten mit Zitat      
raule hat Folgendes geschrieben:
Code:
block_array = {'Subsystem', 0; 'Inport', 0; 'Outport', 0; 'DiscreteFir', 0; 'TriggerPort', 0};
sub_array = {'Subsystem', 3; 'DiscreteFir', 2};
blocks_to_frequencies = containers.Map(sub_array(:,1), sub_array(:,2));

for i = 1:size(block_array, 1)
    current_block = block_array{i,1};
    try
        block_array{i,2} = blocks_to_frequencies(current_block);
    catch err
        if strcmp(err.identifier, 'MATLAB:Containers:Map:NoKey')
            continue
        else
            rethrow(err);
        end
    end
end
block_array


Suuuuper!!! Vielen Dank, hätte ich nie allein geschafft Smile
 
Neues Thema eröffnen Neue Antwort erstellen



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.