プロが教えるわが家の防犯対策術!

Aを5×5の行列として(成分は与えられている)
Pを5×5行列で各列、各行に1が一つ(残りは0)の行列(置換行列)
とします。このときに全てのPに対して
P×A×(Pの逆行列)
を計算するプログラムってmathematicaで出来るのでしょうか?

分かりにくい説明で申し訳ありません!
いずれはn×nでやりたいと思っているのですが、とりあえず5×5くらいで考えています。
あまりmathematicaはやったことがないので、変な質問でしたらすみませんっ。。。

A 回答 (2件)

置換行列の定義が。

ちょっとあいまいな様な気もします。任意の整数を与えたとき、転置行列のリストを返す関数を以下に掲げます。引数で、Debug->Trueをあたえると、計算の途中結果を見ることができます。
置換行列の解釈が私と違う場合、最初の関数を書き直してください。

Options[generatePList] = {Debug -> False};
generatePList[n_, OptionsPattern[]] :=
Module[{i, j, d, J, elm, idxList, idx, mList, debug},
(* 各行に、1が一つだけ、他は0の行列のリストをつくる *)
(* 行列のインデックスの表を作る {{i1,j1},{12,j2},...}をつくる。
Det(P)は逆行列を持たねば張らないから、jk \[NotEqual] jm ( j \[NotEqual] m) *)
debug = OptionValue[Debug];

J = Permutations[Range[n]];

idxList = {};
For[i = 1, i <= Length[J], i++,
j = 1; elm = Map[{j++, #} &, J[[i]]];
idxList = Append[idxList, elm]];

If[debug, Print["idxList = ", idxList ]];
(* 行列を作る *)
idx = Map[# -> 1 &, idxList, {2}];
If[debug, Print[" idx = ", idx]];
mList = Map[Normal[SparseArray[#]] &, idx];
If[debug, Map[Print["matrix = ", MatrixForm[#]] &, mList]];
mList
]

(* 次に PAP^(-1)を計算する部分です.これも計算結果を返してくれます *)
(* 正方行列が、与えられたとき置換行列をすべて計算し、PAP^-1のリストを返す *)
Options[compulePAInverseP] = {Debug -> False};
compulePAInverseP[A_, OptionsPattern[]] /; MatrixQ[A] :=
Module[{debug, dim, pList, i},
debug = OptionValue[Debug];
dim = Dimensions[A];

If[dim[[1]] != dim[[2]], Print["Not Square Matrix"]; Return[Null]];

pList = generatePList[dim[[1]], Debug -> debug];
For[i = 1, i <= Length[pList], i++,
Print[" P = ", MatrixForm[pList[[i]]], " , INV(P) = ",
MatrixForm[Inverse[pList[[i]]]], ",PAP^(-1) = ",
MatrixForm[Simplify[pList[[i]] A Inverse[pList[[i]]]]]]
;
];
Map[# A Inverse[#1] &, pList]
]

A = Array[a, {3, 3}]
compulePAInverseP[A]
(* とすると、お望みの結果が得られます。*)
    • good
    • 0

同類のソフトのMapleでできますのでMathematicaでもできると思います。


参考URLに行列の積や逆行列の取り方の例がありますので参考にしてやってみてください。

参考URL:http://www.alpha-works.com/math/mathematica/chap …
    • good
    • 0
この回答へのお礼

ありがとうございます!
これからちょっとやってみます。

お礼日時:2008/11/19 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!