2016-04-17 5 views
0

Angenommen, A ist n_1 durch n_1 symmetrische Matrix, und B ist n_2 durch n_2 symmetrische Matrix, wobei n_1> n_2 und n_1 typischerweise von 10^3 bis 10^5. Ich möchte das folgende (n_1 * n_2) durch (n_1 * n_2) Matrix C so erhalten, dass jeder Block von C ist C_ {ij} = \ exp (A \ text {. ^} 2/B_ {i, j}^{1.5})/B_ {i, j} mit i = 1, ..., n_2; j = 1, ..., n_2.Effiziente Methode zum Bearbeiten von 3-dimensionalen Arrays in 2-dimensionalen Arrays in MATLAB

Ich habe zwei Möglichkeiten, dies in MATLAB zu berechnen, aber beide Methoden geben mir kein befriedigendes Timing. Im Folgenden werde ich ein minimales Beispiel im MATLAB-Code geben.

n1 = 400; n2 = 15; 
A = randn(n1); A = A + A' + 10*eye(n1); 
B = randn(n2); B = B + B' + 5*eye(n2); 

One way:

tic; 
Atemp = repmat(A, n2, n2); 
Btemp = kron(B, ones(n1)); 
C1 = exp(Atemp.^2./Btemp.^1.5)./Btemp; 
toc; 
Elapsed time is 2.402167 seconds. 

Ein anderer Weg:

tic; 
Btemp = reshape(B, [1 1 n2*n2]); 
Ctemp = bsxfun(@(x,y) exp(x.^2/y.^1.5)/y, A, Btemp); 
[a, b, c] = size(Ctemp); 
Ctemp = reshape(mat2cell(Ctemp, a, b, ones(c,1)), sqrt(c), sqrt(c)); 
C2 = cell2mat(Ctemp); 
toc; 
Elapsed time is 2.923428 seconds. 

Ich frage mich, ob es effiziente Art und Weise ist die Matrix C in MATLAB zu bekommen? Die resultierende Matrix C ist für die Cholesky-Zersetzung erforderlich. In dem zweiten Ansatz muss es einen effizienteren Weg geben (dh es wird vermieden, Ctemp in eine Zelle umzuwandeln und dann eine Zelle in C2 umzuwandeln), um das 3-dimensionale Array Ctemp in das zweidimensionale Array C2 zu konvertieren, aber ich kann es nicht berechnen jetzt draußen.

Vielen Dank!

Antwort

0

bsxfun ist normalerweise nicht so schnell wie Sie erwarten. Auch die Umformung von Zellen/Matten benötigt etwas Zeit. Dein erster Ansatz ist also besser. Aber Atemp.^2./Btemp.^1.5 kann zu kron(1./(B.^1.5), A.^2) vereinfacht werden, um einige der großen zeitlichen Matrizen zu vermeiden und die Geschwindigkeit zu erhöhen.

Hier ist der modifizierte Code und das Timing auf meinem Rechner.

n1 = 400; n2 = 15; 
A = randn(n1); A = A + A' + 10*eye(n1); 
B = randn(n2); B = B + B' + 5*eye(n2); 

tic; 
Btemp = kron(B, ones(n1)); 
C0 = exp(kron(1./(B.^1.5), A.^2))./Btemp; 
toc; 

tic; 
Atemp = repmat(A, n2, n2); 
Btemp = kron(B, ones(n1)); 
C1 = exp(Atemp.^2./Btemp.^1.5)./Btemp; 
toc; 

tic; 
Btemp = reshape(B, [1 1 n2*n2]); 
Ctemp = bsxfun(@(x,y) exp(x.^2/y.^1.5)/y, A, Btemp); 
toc; 
tic; 
[a, b, c] = size(Ctemp); 
Ctemp = reshape(mat2cell(Ctemp, a, b, ones(c,1)), sqrt(c), sqrt(c)); 
C2 = cell2mat(Ctemp); 
toc; 

Elapsed time is 0.426900 seconds. 
Elapsed time is 0.900966 seconds. 
Elapsed time is 2.850293 seconds. 
Elapsed time is 0.706957 seconds. 
Verwandte Themen