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!