In meinem Programm habe ich ein großes (z. B. 100x100) Array von Strukturen, wobei jede Struktur eine angemessene Menge an Daten aufweist (z. B. 1000 Zahlen und einige andere Felder). Zum Beispiel:Wie man eine "Referenz" zu einer Struktur in Matlab macht?
for x = 100 : -1 : 1
for y = 100 : -1 : 1
database(y,x).data = rand(30);
database(y,x).name = sprintf('my %d %d', x, y);
end
end
Ich möchte eine Berechnung von 10-20 Zeilen Code mit meinen Daten tun; zum Beispiel:
for x = 10 : 90
for y = 10 : 90
for dx = -9 : 9
for dy = -9 : 9
result = result + database(y + dy, x + dx).data(1, 1);
result = result + 2 * database(y + dy, x + dx).data(1, 2) * database(y + dy, x + dx).data(2, 2);
... % more stuff here
end
end
end
end
verweist Mein Code auf aktuelles Element der Datenbank als database(y + dy, x + dx)
. Um es kürzer zu machen, gebe es einen Namen zu (C++ würde es nennen „Referenz“):
temp = database(y + dy, x + dx);
result = result + temp.data(1, 1);
result = result + 2 * temp.data(1, 2) * temp.data(2, 2);
Das ist mein Code macht viel kürzer und klarer. Dies ist jedoch auch viel langsamer und Profiling zeigt, dass die Zuweisung temp = ...
70% meiner Ausführungszeit dauert.
Also meine Annahme ist, dass Matlab Kopien den Inhalt des größeren Datenbankelements, meine Zeit zu essen. Ich denke Matlab sollte schlau genug sein, "Copy-on-Write" zu machen, das heißt, kopieren Sie das Zeug nur, wenn es später geändert wird. In meinem Fall passiert dies jedoch nicht - mein Code liest nur aus der Datenbank und ändert sie nicht.
Also, wie kann ich einen effizienten schreibgeschützten Verweis auf eine Struktur machen?
+1 gute Frage - Ich würde gerne die Antwort darauf auch wissen. Jeder Ansatz, den ich ausprobiert habe (das Ausnutzen von Copy-on-Write in Funktionsargumenten, die Verwendung globaler Variablen und die Verwendung von Handle-Klassen) hat zu viel langsameren Code geführt. –
Ich dachte, 'libpointer' könnte helfen, aber das Konstruieren und Arbeiten mit dem Zeiger scheint teurer zu sein, als ich gedacht hätte. – patrickvacek
Arrays von Strukturen sind langsam im Vergleich zu Strukturen von Arrays. Wenn Ihre Daten dies zulassen, versuchen Sie, in die Struktur der Arrays zu konvertieren, und das wird wahrscheinlich viel schneller. http://www.mathworks.com/help/matlab/matlab_prog/memory-allocation.html#brh72ex-14 – jerad