|
Autor |
gpuArray - lookup-Funktion |
|
Greyfox
Ehemals Aktiv  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  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  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  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. |
|
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]
|