Transposing a triangular matrix.
- To: mathgroup at smc.vnet.net
- Subject: [mg24305] Transposing a triangular matrix.
- From: d8442803 at student.nsysu.edu.tw (Wen-Feng Hsiao)
- Date: Fri, 7 Jul 2000 00:11:48 -0400 (EDT)
- Organization: NSYSU
- Sender: owner-wri-mathgroup at wolfram.com
Dear listers,
I am writing a procedure to transpose a triangular matrix. For example,
if the input list is {{0.6`, 0.65`, 0.6`}, {0.75`, 0.65`}, {0.7`}}, then
the output will be {{0.6}, {0.65, 0.75}, {0.6, 0.65, 0.7}}. That is, an
input of an upper triangular matrix as below
- 0.6 0.65 0.6
- 0.75 0.65
- 0.7
-
, will obtain an output of its corresponding lower triangular matrix as
follows.
-
0.6 -
0.65 0.75 -
0.6 0.65 0.7 -
The diagonal elements can be omitted due to no needs for the subsquent
analysis. I have written a pretty nasty version, which needs your help to
sharpen it. Especially, please indicate me how to remove the For & While
statements, but still remain the functionality.
Wen-Feng
------------------------------
lowerTriMatrixQ[lst_List] := Module[{len1, lenall},
len1 = Length[lst];
lenall = Length /@ lst;
Return[Range[len1] == lenall]];
upperTriMatrixQ[lst_List] := Module[{len1, lenall},
len1 = Length[lst];
lenall = Length /@ lst;
Return[Range[len1] == Reverse[lenall]];
];
triMatrixQ[lst_List] := Return[lowerTriMatrixQ[lst] ||
upperTriMatrixQ[lst]];
triTranpose[lst_?triMatrixQ] :=
Module[{trilst = lst, len = Length[lst], i, tmp, res = {}},
If[upperTriMatrixQ[trilst],
i = 1;
While[i <= len,
tmp = {};
For[j = 1, j <= i, j++,
AppendTo[tmp, First[trilst[[j]]]];
trilst[[j]] = Rest[trilst[[j]]];];
AppendTo[res, tmp];
i++;
];
];
Return[res]];
(*For saving space, I only list the codes for upper trianular case*)
In[11]:=
triTranpose[{{0.6`, 0.65`, 0.6`}, {0.75`, 0.65`}, {0.7`}}]
Out[11]=
{{0.6}, {0.65, 0.75}, {0.6, 0.65, 0.7}}