Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » gpuArray - lookup-Funktion
Autor
Universität/Hochschule gpuArray - lookup-Funktion
Greyfox
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 12.08.2003
Mitteilungen: 319
Wohnort: Berlin
  Themenstart: 2017-10-18

Hallo allerseits, ich stehe gerade auf dem Schlauch und brauche mal einen frischen Kopf, der mir hilft. Mein Problem: Sei n\in \IN eine recht große Zahl. Ich habe eine 3-dimensionale Matrix A vom Typ 5\times 5 \times n. Und eine 3-dimensionale Matrix B vom Typ 5\times 5 \times 2000. Ich will nun, auf möglichst effektive Weise eine Matrix C vom Typ 5\times 5 \times n erzeugen und zwar so, dass wenn A(i,j,k)=x ist, dass dann C(i,j,k):=B(i,j,x) ist. Da n recht groß ist und ich vermutlich sehr viel simples gleichzeitig tun könnte, kann ich vermutlich gpuArray verwenden und arrayfun nutzen. Aber ich sehe gerade nicht wie. Bin für Tipps dankbar. Beste Grüße Greyfox


   Profil
majoka
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 25.02.2014
Mitteilungen: 810
  Beitrag No.1, eingetragen 2017-10-19

Wenn ich es richtig verstanden habe, könnte man es so umsetzen. Geht aber bestimmt noch schöner...insbesondere die Umformung der Arrays in Spaltenvektoren und wieder zurück ist vermutlich überflüssig. \sourceon Matlab clear all n = 3; x = 3; A = randi(n,5,5,n); Ac = A(:); B = randn(5,5,2000); B_x = B(:,:,x); B_c = B_x(:); B_c = repmat(B_c,n,1); C_c = zeros(5*5*n,1); index = find(Ac==x); C_c(index) = B_c(index); C = reshape(C_c,5,5,n); %[A C] \sourceoff


   Profil
Greyfox
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 12.08.2003
Mitteilungen: 319
Wohnort: Berlin
  Beitrag No.2, vom Themenstarter, eingetragen 2017-10-19

Hallo majoka, total lieben Dank für Deine Ideen. Wenn ich Deinen Code richtig verstehe, dann verstehen wir uns noch falsch. Ich gebe mal ein übersichtliches Beispiel, dafür skaliere ich mein Problem mal etwas runter: Ich habe eine 3-dimensionale Matrix A vom Typ 1\times 1 \times n. Hier sei n=3. Und eine 3-dimensionale Matrix B vom Typ 1\times 1 \times 7. Ich will nun, auf möglichst effektive Weise eine Matrix C vom Typ 1\times 1 \times n erzeugen und zwar so, dass wenn A(i,j,k)=x ist, dass dann C(i,j,k):=B(i,j,x) ist. Nun das Beispiel: A(1,1,:)=[3, 5, 1]; B(1,1,:)=[7, 0.2, -3, 11, 0, 2, 0] Dann soll C(1,1,:)=[-3, 0, 7] sein. Also C(i,j,k)=B(i,j,A(i,j,k)). Das Problem: Wenn ich das so rechne... for i=1:5 for j=1:5 for k=1:6365768236487972374 C(i,j,k)=B(i,j,A(i,j,k)) end end end ...dann ist das furchtbar ineffektiv. Weil alles hintereinander läuft. Obwohl eigentlich alles parallel laufen könnte.


   Profil
majoka
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 25.02.2014
Mitteilungen: 810
  Beitrag No.3, eingetragen 2017-10-19

\quoteon(2017-10-19 15:57 - Greyfox in Beitrag No. 2) Ich habe eine 3-dimensionale Matrix A vom Typ 1\times 1 \times n. \quoteoff Wirklich? Dann geht es einfach so (nutze bitte auch den Quelltextbereich!) \sourceon Matlab A(1,1,:)=[3, 5, 1]; B(1,1,:)=[7, 0.2, -3, 11, 0, 2, 0] As = squeeze(A); Bs = squeeze(B); Cs = Bs(As)' C(1,1,:) = Cs; \sourceoff Die Zahl "6365768236487972374" in der for-Schleife wird doch schon gar nicht mehr richtig dargestellt!? \sourceon Matlab >> 6365768236487972374-6365768236487972373 ans = 0 \sourceoff


   Profil
Greyfox hat die Antworten auf ihre/seine Frage gesehen.
Greyfox wird per Mail über neue Antworten informiert.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]