[R] Help on comparing two matrices

David Winsemius dwinsemius at comcast.net
Sat Aug 22 21:47:58 CEST 2009


On Aug 22, 2009, at 3:36 PM, Steve Lianoglou wrote:

> Hi,
>
> On Sat, Aug 22, 2009 at 2:45 PM, Michael Kogan  
> <michael.kogan at gmx.net>wrote:
>
>> Hi,
>>
>> I need to compare two matrices with each other. If you can get one  
>> of them
>> out of the other one by resorting the rows and/or the columns, then  
>> both of
>> them are equal, otherwise they're not. A matrix could look like this:
>>
>>   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
>> [1,]    0    1    1    1    0    1    1    0
>> [2,]    1    1    0    0    0    1    0    1
>> [3,]    1    0    1    0    0    0    1    1
>> [4,]    1    1    0    0    1    0    0    0
>> [5,]    1    0    1    1    1    0    0    0
>> [6,]    0    1    0    1    1    0    0    0
>> [7,]    0    0    0    0    0    1    1    1
>>
>> Note that each matrix consists of ones and zeros, in each row and  
>> in each
>> column there are at least three ones and one zero and each pair of
>> rows/columns may have at most two  positions where both are ones  
>> (e.g. for
>> the 1. and 2. rows those positions are 2 and 6).
>>
>> I was advised to sort both matrices in the same way and then to  
>> compare
>> them element by element. But I don't manage to get them sorted... My
>> approach is as following:
>>
>> 1. Sort the rows after the row sums (greater sums first).
>> 2. Sort the columns after the first column (columns with ones in  
>> the first
>> row go left, columns with zeros go right).
>> 3. Save the left part (all columns with ones in the first row) and  
>> the
>> right part in separate matrices.
>> 4. Repeat steps 2 and 3 with both of the created matrices (now  
>> taking the
>> second row for sorting), repeat until all fragments consist of a  
>> single
>> column.
>> 5. Compose the columns to a sorted matrix.
>>
>> This algorithm has several problems:
>>
>> 1. How to make a loop that is branching out in two subloops on each
>> iteration?
>> 2. How to organize the intermediate results and compose them  
>> without losing
>> the order? Maybe save them in lists and sublists?
>> 3. A fundamental problem: If there are rows with equal sums the  
>> result may
>> depend on which of them is sorted after first. Maybe this algorithm  
>> won't
>> work at all because of this problem?
>
>
> Ouch, this seems like a real PITA.

Well, I certainly agree with that.

Why not sort by a concatenation of the rows and then see if they are  
equal:

sm <- matrix(scan(textConnection("
0    1    1    1    0    1    1    0
1    1    0    0    0    1    0    1
1    0    1    0    0    0    1    1
1    1    0    0    1    0    0    0
1    0    1    1    1    0    0    0
0    1    0    1    1    0    0    0
0    0    0    0    0    1    1    1")), 7, 8)

 > sm[order(sapply(1:7, function(x) Reduce(paste, smt[x,])) ), ]
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    0    0    0    1    1    0    0
[2,]    0    0    1    1    1    0    0    1
[3,]    1    0    0    0    0    0    0    1
[4,]    1    0    0    1    0    0    0    0
[5,]    1    1    0    0    1    1    0    1
[6,]    1    1    1    1    0    0    1    0
[7,]    1    1    1    1    0    1    1    0

Then an identical() test on the sorted matrices?


>
> If you want to go about this by implementing the algo you described,  
> I think
> you'd be best suited via some divide-and-conquer/recursion route:
>
> http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm
>
> Perhaps you can take inspiration from some concrete sorting  
> algorithms that
> are implemented this way:
>
> Merge sort: http://en.wikipedia.org/wiki/Merge_sort
> Quick sort: http://en.wikipedia.org/wiki/Quicksort
>
> Hope that helps,
> -steve
>

David Winsemius, MD
Heritage Laboratories
West Hartford, CT




More information about the R-help mailing list