das codebook ist eine 2000x128 und descriptor ein cellarray mit zb jeweils einer 34x128 matrix. innerhalb der for schleife zieht allen zeilen von codebook jeweils eine Zeile von Descriptor ab und ermittelt die summe.
kann man die inner for schleife irgendwie verhindern? ist die äußere schleife auch vermeidbar?
beide in kombination sind leider sehr rechenintensiv
den Code wie es hier steht, versteh ich nicht.
Und so würde ich sagen dass es nicht reduzierbar ist.
Aber ich glaube du machst hier einen Denkfehler. Ich sehe dass in Innerer Schleife distance bei nächstem discriptor überschrieben wird
Vielleicht ist BSXFUN hier nicht notwendig.
Bitte genau beschreiben was es macht, anhand eines kleines Beispiels.
also ich habe ein Cellarray Descriptor, das in jeder Zelle eine N x n Matrix M enthält. Das Cellarray ist zb 1x326 groß. Dann habe ich zusätzlich ein Array Codebook C, das c x n groß ist (mit c>>N).
Die Aufgabe ist es, für jede Matrix in dem Cellarray die zeilenweise Differenz zu bilden. also ich nehme von M die erste Zeile und subtrahiere diese vom Codebook. anschließend errechne ich die Vektornorm der Zeilen (quadrieren, Summe in x-Richtung und Wurzel ziehen (den Schritt hatte ich dem Beispiel nicht dabei, da ich das die Wurzel auf distance später bequem außerhalb der for Schleife berechnen konnte. im Anschluß errechne ich noch ein Histogram aus der Distanz (hatte ich aber nicht im code drin)
also der original code war folgender:
Code:
code_size=size(codebook,1);
for i=1:numel(descriptor)
desc_size=size(descriptor{1,i},1);
for c=1:desc_size
for p=1:code_size
distance(p,c)=norm(codebook(p,:)-descriptor{1,i}(c,:));
end end
die innerste for Schleife habe ich dann durch ersetzen von norm() mit sqrt(sum((A-B).^2)) aufgelöst. da ich nur die summe des Vektors in X-Richtung brauche sum(...,2)
Code:
code_size=size(codebook,1);
for i=1:numel(descriptor)
desc_size=size(descriptor{1,i},1);
for c=1:desc_size
distance(:,c)=sum(bsxfun(@minus,codebook,descriptor{1,i}(c,:)).^2,2);
end
distance=sqrt(distance);
... end
hoffe ich hab nicht noch mehr verwirrt
also nochmal kurz zusammengefasst: von einer matrix die zeilen einer anderen matrix abziehen und einen wert aus der entstehenden zeile berechnen.
@ Peter Quint
Guter Versuch, aber so einfach ist es mit Cells nicht.
Bei Kombination von Indizien in Cell Array muss erste Klammerpaar fest sein, sonst kommt Fehlermeldung: "??? Bad cell reference operation."
@ asxoniles
Sind denn in descriptor gleich große Matrizen abgelegt ?
Wenn nicht, dann kann man äußere Loop nicht vermeiden.
funktioniert 1A, die Werte sind fast identistisch und ist super schnell. Man muss nur mal schauen ob die Dimensionen passen.
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.