Probleme beim Anwenden einer Liste von Indizes auf eine Matrix

Aug 26 2020

Ich bin daran interessiert, eine 1D-Liste der Elemente des oberen Dreiecks einer Matrix zu erstellen.

Ich kann die Indizes dieser Elemente wie folgt erfassen:

upperTrianglularIndices[dim_] := Subsets[Table[i, {i, val /. val -> dim}], {2}];

Aber ich habe Mühe, die Matrixelemente mithilfe dieser Indizes tatsächlich auszuwählen.

Wenn ich eine Funktion habe, weiß ich, dass ich sie mit diesem Code abbilden kann:

f @@ # & /@ upperTrianglularIndices[3]

welches zurückkehren wird:

{f[1, 2], f[1, 3], f[2, 3]}

Meine Idee ist es also, meine Matrix als Funktion, Funktion [Matrix [[x]], x] auszudrücken und sie dann mit dem obigen Code auf jeden Index anzuwenden. Ich sehe, dass dies so richtig funktioniert:

(x \[Function] f[[x]]) @@ # & /@ upperTrianglularIndices[3]

Funktioniert aber nicht, wenn ich festlege, dass die Funktion die Auswahl des Matrixelements sein soll:

(x \[Function] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}[[x]]) @@ # & /@ 
 upperTrianglularIndices[3]

Dies gibt zurück (mit einigen Fehlern):

{f[[1]], f[[1]], f[[2]]}

Was ist das Problem hier?

Antworten

3 BobHanlon Aug 26 2020 at 18:46
Clear["Global`*"]

Format[f[m_, n_]] := Subscript[f, m, n]

n = 3;

(mat = Array[f, {n, n}]) // MatrixForm

Die Indizes sind

upperTrianglularIndices[n_] :=
 Table[{i, j}, {i, n}, {j, i, n}] // Flatten[#, 1] &

upperTrianglularIndices[n]

(* {{1, 1}, {1, 2}, {1, 3}, {2, 2}, {2, 3}, {3, 3}} *)

Die entsprechenden Elemente des Arrays sind

mat[[##]] & @@@ upperTrianglularIndices[n]