Re: Adding a value to the cell of a matrix
- To: mathgroup at smc.vnet.net
- Subject: [mg76062] Re: Adding a value to the cell of a matrix
- From: Ray Koopman <koopman at sfu.ca>
- Date: Tue, 15 May 2007 05:05:29 -0400 (EDT)
- References: <f23qem$o48$1@smc.vnet.net>
On May 12, 12:30 am, newbie <purete... at gmail.com> wrote:
> I have a matrix of values that i am searching for a specific value
> in and i want to count the number of occurances in each column.
> which i can do but not in a loop. I want to be able to use a
> matrix to store the number of occurances so i can put it in a loop.
> I already have a loop that finds the values and just adds them to
> a value i created. do you know how i can add +1 to the cell of a
> matrix? When i try to do this it says the values are protected.
> i tried unprotecting them but couldn't get that to work.
>
> any ideas?
>
> Here is the code i am using for the search
>
> Orderedcellcycle = OverExpressed; (* Dimensions {200, 18} *)
>
> l = matrix1; (* {5164, 18} *)
>
> Do[l[[All,i]] = Ordering[matrix1[[All,i]]], {i,1,18}];
>
> Do[Do[Orderedcellcycle[[i,j]] = annotations[[l[[i,j]],6]],
> {i,1,200}],
> {j,1,18}];
>
> gcounter = scounter = gmcounter = mgcounter = sgcounter = 0;
>
> Do[Do[If[Orderedcellcycle[[i,j]] == "G1",
> gcounter = gcounter + 1, gcounter = gcounter + 0],
> {i,1,200}];
> Do[If[Orderedcellcycle[[i,j]] == "S",
> scounter = scounter + 1, scounter = scounter + 0],
> {i,1,200}];
> Do[If[Orderedcellcycle[[i,j]] == "S/G2",
> sgcounter = sgcounter + 1, sgcounter = sgcounter + 0],
> {i,1,200}];
> Do[If[Orderedcellcycle[[i,j]] == "G2/M",
> gmcounter = gmcounter + 1, gmcounter = gmcounter + 0],
> {i,1,200}];
> Do[If[Orderedcellcycle[[i,j]] == "M/G1",
> mgcounter = mgcounter + 1, mgcounter = mgcounter + 0],
> {i,1,200}],
> {j,1,18}]
This will give five 18-element lists of counts.
Although "l" is {5164, 18}, you use only the first 200 elements
in each column, so those are the only ones I put into "L".
It's much easier to work with rows than columns.
L = Ordering[#,200]& /@ Transpose @ matrix1; (*{5164,18}->{18,200}*)
orderedcellcycle = annotations[[#,6]]& /@ L; (* {18,200} *)
gcount = Count[#,"G1" ]& /@ orderedcellcycle; (* {18} *)
scount = Count[#,"S" ]& /@ orderedcellcycle; (* {18} *)
sgcount = Count[#,"S/G2"]& /@ orderedcellcycle; (* {18} *)
gmcount = Count[#,"G2/M"]& /@ orderedcellcycle; (* {18} *)
mgcount = Count[#,"M/G1"]& /@ orderedcellcycle; (* {18} *)
If you have many patterns for which you need counts, you might want
to do something like this, which gives a {5, 18} matrix of counts:
patternlist = {"G1", "S", "S/G2", "G2/M", "M/G1"};
countmatrix = Outer[Count[#2,#1]&, patternlist, orderedcellcycle, 1];