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}}