Re: How to use Thread when second argument to function is a list

*To*: mathgroup at smc.vnet.net*Subject*: [mg86393] Re: How to use Thread when second argument to function is a list*From*: Peter Pein <petsie at dordos.net>*Date*: Mon, 10 Mar 2008 02:04:12 -0500 (EST)*References*: <fr0cqr$eh8$1@smc.vnet.net>

Nasser Abbasi schrieb: > Hello; > > I have a function which I want to call repeatedly for all rows of a matrix > to find non-zero elements in each row. > This function takes as input the row number and the matrix itself and > returns a list that contain the non-zero elements in the that row. > > i.e. function is f[ list , matrix]:=Module[{},.....] > > I want to use Thread to call this function 'f' over all the rows of the > matrix. Something like > > Thread[ f[{1,2,3}, matrix] ] > > But it is not working. I guess becuase matrix is a list of lists and it is > of different dimension than the list of the row numbers? > I can use MapThread, but then I have to write > > MapThread[ f {{1,2,3}, {matrix,matrix,matrix}} ] > > and the above works but I have to duplicate 'matrix' to make it work, which > I do not like. > > Here is the code that does not work > > ------------------- Thread not working, why? ----------------- > > findNonZeroElements[row_, p_] := Module[{}, Select[p[[row,All]], #1 != 0 > & ]] > > mchain[p_] := Module[{lhs, rhs}, > {nRow, nCol} = Dimensions[p]; > lhs = Range[nRow]; > Thread[findNonZeroElements[lhs, p]] (* NOT WORKING *) > ] > > p = {{1, 0, 0, 0, 0}, {0, 0.2, 0.8, 0, 0}, {0, 0.7, 0.3, 0, 0}, > {0.1, 0, 0.1, 0.4, 0.4}, {0, 0.1, 0.3, 0.2, 0.4}}; > > mchain[p] > --------------------------------------------------------- > > Here is the same as above but using MapThread and this works > > In[172]:= findNonZeroElements[row_, p_] := Module[{}, Select[p[[row,All]], > #1 != 0 & ]] > > mchain[p_] := Module[{lhs, rhs}, > {nRow, nCol} = Dimensions[p]; > lhs = Range[nRow]; > MapThread[findNonZeroElements, {lhs, Table[p, {nRow}]}] (*OK*) > ] > > p = {{1, 0, 0, 0, 0}, {0, 0.2, 0.8, 0, 0}, {0, 0.7, 0.3, 0, 0}, > {0.1, 0, 0.1, 0.4, 0.4}, {0, 0.1, 0.3, 0.2, 0.4}}; > mchain[p] > > Out[175]= {{1}, {0.2, 0.8}, {0.7, 0.3}, {0.1, 0.1, 0.4, 0.4}, {0.1, 0.3, > 0.2, 0.4}} > > thanks, > Nasser > > Hi Nasser, this is a task for Map: In[1]:= findNonZeroElements[row_, p_] := Select[p[[row]], #1 != 0 & ] mchain[p_] := (findNonZeroElements[#1, p] & ) /@ Length[p]] p = {{1, 0, 0, 0, 0}, {0, 0.2, 0.8, 0, 0}, {0, 0.7, 0.3, 0, 0}, {0.1, 0, 0.1, 0.4, 0.4}, {0, 0.1, 0.3, 0.2, 0.4}}; mchain[p] Out[4]= {{1}, {0.2, 0.8}, {0.7, 0.3}, {0.1, 0.1, 0.4, 0.4}, {0.1, 0.3, 0.2, 0.4}} or simply: Clear[mchain] mchain[m_]:=MSelect[#, # != 0 &] & /@ m Peter