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... ), 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....
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
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
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
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);
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.
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
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);
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
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
Einstellungen und Berechtigungen
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
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.