[R] Help on comparing two matrices
Gabor Grothendieck
ggrothendieck at gmail.com
Sun Aug 23 00:34:17 CEST 2009
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?
>
> Thanks in advance for your input,
> Michael
>
Define two test matrices, m1 and m2, and then a function
which sorts its argument into standardized form. Finally
compare the standardized versions:
m1 <- matrix(c(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)
m2 <- m1[7:1, ]
stdize <- function(x) x[do.call(order, as.data.frame(x)),]
identical(stdize(m1), stdize(m2))
More information about the R-help
mailing list