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

Vektoren indizieren: a_i

 

MarkusAC
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2009, 12:45     Titel: Vektoren indizieren: a_i
  Antworten mit Zitat      
Hallo, Ihr Lieben,

gerade arbeite ich mit MATLAB und habe folgendes Problem:

Ich möchte Vektoren unterschiedlicher (!) Dimension (Zeilenvektoren) möglichst so definieren: a_1, a_2, a_3, etc., da ich in einer Schleife auf die Länge length(a_i) zugreifen möchte.

Wie kann ich das am besten tun?

Ich habe es mit para{1}=..., para{2}=..., para{3}=... etc. versucht (z.B. para{1} = [0:0.1:1]), aber diese Matlab-Version hier, die schon etwas älter ist (2005 -> Uni, kein Geld... Smile ), hat da wohl einen Bug.
Denn mal wird mir die Länge eines solchen Vektors berechnet, mal erscheint eine Fehlermeldung "??? Subscript indices must either be real positive integers or logicals." Gebe ich wieder clear all; ein und versuche es danach erneut, klappt es wieder. Merkwürdig...

Daher suche ich jetzt eine andere Möglichkeit, als para{i} zu verwenden. Sieht jemand einen Ausweg?

a_str2num('i') = [0:0.1:1] habe ich versucht, aber auch da gibt es eine Fehlermeldung....

Vielen Dank für die Hilfe!

Viele Grüße
Markus
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.08.2009, 13:51     Titel:
  Antworten mit Zitat      
Hallo,
1) ich glaube weniger, dass es Matlab Bug ist,
Zitat:

??? Subscript indices must either be real positive integers or logicals

Der Fehler sagt nämlich, dass du auf Cell-Array falsch zugreifst.
para{i}, der Index i wird wahrscheinlich irgend wo überschrieben, und ist gleich z.B 0

Verwende statt i andere Variablennamen (z.B idx_cell)

Außerdem sollte man in Matlab i und j nicht verwendet,
sie sind reserviert für Komplexe Zahlen.

2) Ich rate dir aber nicht , Alternative zu verwenden,
weil es langsamer, komplizierter und unübersichtiger ist,
Dazu schaue dir in der Hilfe eval, evalin


PS: Matlab-Version bekommst du mit ver raus
Private Nachricht senden Benutzer-Profile anzeigen
 
MarkusAC
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2009, 17:55     Titel: Nein, klappt nicht.
  Antworten mit Zitat      
Erst mal vielen Dank für die Hilfe! Aber an i und j liegt es nicht. Hier der Code:

para{1} = [0:0.001:1.15];
para{2}= [..... etc. etc.
.
.
.
para{12}=...

mu = [0.075, 5.099, -0.146, 6.242, 4.905, 10.000, 0.020, 1.500, -1.518, 0.010, 3.472, -0.200];

length = 20; %Länger der zufälligen Parametervektoren

fid = fopen('C:\Programme\MATLAB71\work\VST-Plugin-Parameter variieren\Parametervektoren.txt','wt');
fprintf(fid, 'Die Parametervektoren lauten:\n');
fprintf(fid, '\n');

for k = 1:12

[z, counter] = rndpar(min(para{k}), max(para{k}), mu(k), 5/12*mu(k), length);

fprintf(fid, 'Parameter Nr. %d:\t[',k);

for m = 1:length
for l = 1:length(para{k})
while z(m) >= para{k}(l)
l = l +1;
end
break;
end

if m < length
if (abs(z(m)-para{k}(l-1)) <= abs(z(m)-para{k}(l)))
fprintf(fid, '%6.3f, ',para{k}(l-1));
else
fprintf(fid, '%6.3f, ',para{k}(l));
end
else
if (abs(z(m)-para{k}(l-1)) <= abs(z(m)-para{k}(l)))
fprintf(fid, '%6.3f]\t\t',para{k}(l-1));
else
fprintf(fid, '%6.3f]\t\t',para{k}(l));
end
end
end
fprintf(fop, 'Anzahl der Gesamtsamples: %d \n\n',counter);
end

fclose(fid);
----------------------------------------------------------------------------------

rndpar gibt bei mir einen Zufallsvektor von normalverteilten Zahlen aus, die zwischen min und max liegen. Mu und Stdabweichung gibt man in die Funktion ein. Ausgabe ist ein Vektor z.
Wenn ich das ablaufen lasse, erscheint die Meldung:

??? Subscript indices must either be real positive integers or logicals.

Error in ==> parcalc at 35
for l = 1:length(para{k})
----------------------------------------

Matlab-Version: 7.1.0.246 (R14) Service Pack 3, August 02, 2005

Zuletzt bearbeitet von MarkusAC am 11.08.2009, 17:57, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
MarkusAC
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2009, 17:57     Titel: oh...
  Antworten mit Zitat      
sorry, dass der Code so untereinander gequetscht wurde, das hatte ich eigentlich anders eingegeben...
Noch ein Versuch... unter "mu = [[....]" kommt:

Code:

mu = [0.075, 5.099, -0.146, 6.242, 4.905, 10.000, 0.020, 1.500, -1.518, 0.010, 3.472, -0.200];

length = 20; %Länger der zufälligen Parametervektoren

fid = fopen('C:\Programme\MATLAB71\work\VST-Plugin-Parameter variieren\Parametervektoren.txt','wt');
fprintf(fid, 'Die Parametervektoren lauten:\n');
fprintf(fid, '\n');

for k = 1:12

    [z, counter] = rndpar(min(para{k}), max(para{k}), mu(k), 5/12*mu(k), length);
   
    fprintf(fid, 'Parameter Nr. %d:\t[',k);

        for m = 1:length
              for l = 1:length(para{k})
                   while z(m) >= para{k}(l)
                         l = l +1;
                    end
                  break;
              end
             
              if m < length
                 if (abs(z(m)-para{k}(l-1)) <=  abs(z(m)-para{k}(l)))
                      fprintf(fid, '%6.3f, ',para{k}(l-1));
                 else
                      fprintf(fid, '%6.3f, ',para{k}(l));  
                 end
              else
                  if (abs(z(m)-para{k}(l-1)) <=  abs(z(m)-para{k}(l)))
                      fprintf(fid, '%6.3f]\t\t',para{k}(l-1));
                 else
                      fprintf(fid, '%6.3f]\t\t',para{k}(l));    
                 end
              end
        end
        fprintf(fop, 'Anzahl der Gesamtsamples: %d \n\n',counter);
end
fclose(fid);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 12.08.2009, 08:14     Titel: Re: oh...
  Antworten mit Zitat      
MarkusAC hat Folgendes geschrieben:
sorry, dass der Code so untereinander gequetscht wurde, das hatte ich eigentlich anders eingegeben...

Da du registriert bist, kannst du deine Beiträge auch editieren Wink

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
MarkusAC
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 11.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2009, 09:33     Titel:
  Antworten mit Zitat      
Ja, Steve, richtig. Das habe ich danach auch gemerkt. Editieren kann man sie, aber nicht löschen nach einer gewissen Zeit. Sonst hätte ich meinen vorigen Beitrag gelöscht. Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.08.2009, 09:55     Titel:
  Antworten mit Zitat      
Hallo,
mir fällt auf ersten Blick,
dass du reserviertes Wort length verwendest,
das führt aber zum Fehler,
wenn du length(para{k}) wieder als Funktion verwendest

Ansonsten, habe ich noch paar Kommentare eingefügt,
wo es eventuell krachen könnte.

Code:

mu = [0.075, 5.099, -0.146, 6.242, 4.905, 10.000, 0.020, 1.500, -1.518, 0.010, 3.472, -0.200];
%
% 1)  length darfst du so nicht verwenden,
% weil später bei Verwendung length(para{k}) wird es krachen
length = 20; %Länger der zufälligen Parametervektoren

fid = fopen('C:\Programme\MATLAB71\work\VST-Plugin-Parameter variieren\Parametervektoren.txt','wt');
fprintf(fid, 'Die Parametervektoren lauten:\n');
fprintf(fid, '\n');

for k = 1:12

    [z, counter] = rndpar(min(para{k}), max(para{k}), mu(k), 5/12*mu(k), length);
   
    fprintf(fid, 'Parameter Nr. %d:\t[',k);

        for m = 1:length
%
% 1) an dieser Stelle wird es krachen
              for l = 1:length(para{k})
                   while z(m) >= para{k}(l)
                         l = l +1;
                    end
                  break;
              end
             
              if m < length
% 2) hier muss sicher gehen dass l >1 ist
                 if (abs(z(m)-para{k}(l-1)) <=  abs(z(m)-para{k}(l)))
                      fprintf(fid, '%6.3f, ',para{k}(l-1));
                 else
                      fprintf(fid, '%6.3f, ',para{k}(l));  
                 end
              else
                  if (abs(z(m)-para{k}(l-1)) <=  abs(z(m)-para{k}(l)))
                      fprintf(fid, '%6.3f]\t\t',para{k}(l-1));
                 else
                      fprintf(fid, '%6.3f]\t\t',para{k}(l));    
                 end
              end
        end
% 3) File-Zeiger fop soll initialisiert sein
        fprintf(fop, 'Anzahl der Gesamtsamples: %d \n\n',counter);
end
fclose(fid);
 



PS: wenn es weiterhin zu Fehler führt, schreib an welcher Stelle von diesem Code es denn passiert.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.08.2009, 17:34     Titel:
  Antworten mit Zitat      
Zitat:

mir fällt auf ersten Blick,
dass du reserviertes Wort length verwendest,
das führt aber zum Fehler,
wenn du length(para{k}) wieder als Funktion verwendest


Hallo nach einigem Überlegen,
kann ich dir beantworten, warum Matlab meint,
dass du falschen Indizien verwendest.

Wie oben erwähnt, verwendest du reservierten Bezeichner length als eine Variable.
Da Matlab matrix-orientiert arbeitet, ist length einstelliger Vektor
nun versuchst du die Länge von Vektor para festzustellen
Code:

for l = 1:length(para{k})
 


para{k} liefert Vektor-Werte an length ,
da length aber keine Funktion mehr ist.
Werden von Matlab die Vektor-Werte als Indizien behandelt.
Code:

b=1:2:20;
% matlab erlaubt ziemlich schnelle Zugriffe in der Matrix
% nennt man Vektorisierung
b(b>10)=1;
a=1:5;
b(a)=2
 


Da das para{k} aus Komma-Zahlen besteht, wird dein Fehler ausgeben.
??? Subscript indices must either be real positive integers or logicals

z.B den Fehler kannst du so reproduzieren
Code:

length=20;
length([0.1, 0.2]);
 


Parser folgt bestimmter Regeln,
also prüft Matlab zuerst, ob es ganze oder boolesche(logical) Zahlen sind
und dann ob die Dimensionsgrenzen nicht gesprengt werden.

Aber Matlab-Parser überprüft nicht, ob du reservierten Bezeichner verwendest. Das muss man selbst übernehmen.

Vermeide in Zukunft die Nutzung von reservierten Bezeichner, in dem du
möglichst sinnvolle Bezeichner-Namen wählst, wie
max_para_length=20
Private Nachricht senden Benutzer-Profile anzeigen
 
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.