Re: Comparing Corresponding Columns of Two Matrices
- To: mathgroup at smc.vnet.net
- Subject: [mg97535] Re: Comparing Corresponding Columns of Two Matrices
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Sat, 14 Mar 2009 18:16:19 -0500 (EST)
On 3/14/09 at 5:39 AM, gregory.lypny at videotron.ca (Gregory Lypny) wrote: >Suppose I have two 100 x 4 matrices, X and Y, and I want to see >whether each value in a column of X is bigger than each value in the >corresponding column of Y. In other words, compare column 1 of X >with column 1 of Y, column 2 of X with column 2 of Y, and so on. >It's easy to generate a 100 x 4 table of Booleans using Table as >Table[Boole[X[[i , j]] > Y[[i, j]]], {i, 100}, {j, 4}] >But what about without Table? I am able to do it for the comparison >of any one column as >Boole[#[[1]] > #[[2]]] & /@ Transpose[{X[[All, ]], Y[[All, 1]]}] >but I'm not sure how to extend this to other columns. Any tip would >be much appreciated. While this particular problem could be solved using Map or MapThread, there is much simpler and more efficient way to get the desired result Unitize[Sign[x -y] +1] will return a matrix of 1's and 0's. Element i,j will be 1 if y[[i,j]]<x[[i,j]] and 1 other wise But if you want to use something similar to Map the same result can be obtained as follows: MapThread[Unitize[Sign[#1-#2]+1]&,{x,y}] Or if you prefer to use Boole and Map the same result can be obtained as: Transpose@ Map[Boole[GreaterEqual @@ #] &, Transpose[{x, y}, {3, 2, 1}], {2}] To verify the above: In[61]:= x = RandomInteger[{0, 10}, {5, 5}]; y = RandomInteger[{0, 10}, {5, 5}]; In[63]:= Unitize[Sign[x - y] + 1] == Transpose@ Map[Boole[GreaterEqual @@ #] &, Transpose[{x, y}, {3, 2, 1}], {2}] Out[63]= True In[64]:= Unitize[Sign[x - y] + 1] == MapThread[Unitize[Sign[#1 - #2] + 1] &, {x, y}] Out[64]= True