Erstellung von Index-Arrays für csc_matrix
Verfasst: Montag 3. Juni 2013, 21:02
Hallo,
ich versuche momentan ein Programm das ich in Octave geschrieben habe in Python zu übersetzten.
Das Programm berechnet am Ende ein Sparse-Eigenwertproblem. Ich scheitere allerdings bereits beim Erstellen meiner csc_matrix.
Ich möchte mir ein Daten-Array, ein Column _Index- und ein Row_Index-Array erzeugen und dies nutzen um meine Martix zu erzeugen.
Beispielhaft möchte ich eine 5x5 große Matrix erzeugen die mit null initialisiert ist und einem Rand r der Breite r=2 den Wert 5000 zuweist.
Das klappt auch soweit für den oberen und den unteren Rand, allerdings sobald ich mehr als zwei Anweisungen der Form: [np.arange(r)]*ny (ny ist die Spaltenanzahl) in die Anweisung np.array() schreibe bekomme ich eine Fehlermeldung.
Meine Frage ist nun, wie erzeuge ich ein Array (möglichst in einer Zeile) das mehrer Anweisungen der Form [np.arange(r)]*ny verkraftet.
Damit es deutlicher wird hier der Octave-Code der 2 Matrizen die ich erzeugen möchte:
Matrix 1: Diese Matrix ist nur am Rand ungleich Null.
Für den oberen Rand funktioniert das auch noch ganz gut in Python:
Sobald ich nun versuche bpsw. die Index-Arrays für den linken Rand anzuhängen an A_row und A_col kommt es zu einer Reihe Fehlermeldungen.
Matrix 2:
(sparse(Zeilenindices,Spaltenindices,Daten,Zeilenanzahl,Spaltenanzahl))
Bei der Erzeugung dieser Matrix in Python scheitert es ebenfalls daran die notwendigen Arrays zu erzeugen.
Ich dachte nun, dass ich um diese Matrix zu realisieren nur die Spalten-Indices und die Zeilen-Indices in jeweils ein Array zusammenfassen muss und die Datenarrays (diavec-diavec3) ebenfalls in ein Array zusammen fasse.
Ich wäre euch sehr dankbar, wenn ihr mir erklären könntet wie ich das bewerkstellige.
Ich hoffe ich hab mich verständlich ausgedrückt
Grüße
Shaint
ich versuche momentan ein Programm das ich in Octave geschrieben habe in Python zu übersetzten.
Das Programm berechnet am Ende ein Sparse-Eigenwertproblem. Ich scheitere allerdings bereits beim Erstellen meiner csc_matrix.
Ich möchte mir ein Daten-Array, ein Column _Index- und ein Row_Index-Array erzeugen und dies nutzen um meine Martix zu erzeugen.
Beispielhaft möchte ich eine 5x5 große Matrix erzeugen die mit null initialisiert ist und einem Rand r der Breite r=2 den Wert 5000 zuweist.
Das klappt auch soweit für den oberen und den unteren Rand, allerdings sobald ich mehr als zwei Anweisungen der Form: [np.arange(r)]*ny (ny ist die Spaltenanzahl) in die Anweisung np.array() schreibe bekomme ich eine Fehlermeldung.
Meine Frage ist nun, wie erzeuge ich ein Array (möglichst in einer Zeile) das mehrer Anweisungen der Form [np.arange(r)]*ny verkraftet.
Damit es deutlicher wird hier der Octave-Code der 2 Matrizen die ich erzeugen möchte:
Matrix 1:
Code: Alles auswählen
nx = 4
ny = 5
n=nx*ny;
r=1;
sigma_Cu = 5e7;
sigma_mat = zeros(nx,ny);
sigma_mat(1:r,:) = sigma_Cu;
sigma_mat(end:-1:end-(r-1),:) = sigma_Cu;
sigma_mat(:,1:r) = sigma_Cu;
sigma_mat(:,end:-1:end-(r-1)) = sigma_Cu;
Für den oberen Rand funktioniert das auch noch ganz gut in Python:
Code: Alles auswählen
x = 5000
times = ny*r*2+(nx-2*r)*2
data_vec = np.array([x]*ny*r)
A_row = np.array([np.arange(r)]*ny).flatten()
A_col = np.array([np.arange(ny)]*r).flatten()
A = scipy.sparse.csc_matrix((data_vec,(A_row,A_col)),shape=[nx,ny])
Matrix 2:
Code: Alles auswählen
diagvec = ones(1,n);
diagvec2 = ones(1,n);
diagvec2(1:nx:end) = 2;
diagvec3 = ones(1,n);
diagvec3(nx:nx:end) = 0;
A = sparse([1:n],[1:n],diagvec,n,n);
A = A + sparse([1:nx],[1:nx],diagvec(1:nx),n,n);
A = A + sparse([nx+1:n],[1:n-nx],diagvec(1:n-nx),n,n);
Bei der Erzeugung dieser Matrix in Python scheitert es ebenfalls daran die notwendigen Arrays zu erzeugen.
Ich dachte nun, dass ich um diese Matrix zu realisieren nur die Spalten-Indices und die Zeilen-Indices in jeweils ein Array zusammenfassen muss und die Datenarrays (diavec-diavec3) ebenfalls in ein Array zusammen fasse.
Ich wäre euch sehr dankbar, wenn ihr mir erklären könntet wie ich das bewerkstellige.
Ich hoffe ich hab mich verständlich ausgedrückt
Grüße
Shaint