[R] reordering of matrix rows to maximize the sum of the diagonal

Jonathan jonsleepy at gmail.com
Fri Apr 23 22:49:26 CEST 2010


Hi Dimitris,
   This code is very helpful, although I note that the columns are not
preserved, ie if

> M <- matrix(sample(13, 9, TRUE), 3, 3)
produces:

> M
     [,1] [,2] [,3]
[1,]   13    9    2
[2,]   10    1   12
[3,]   11    6    7

then

> n <- ncol(M)
> ind <- apply(M, 2, which.max)
> maxs <- M[cbind(ind, 1:n)]
> diags <- diag(M)
> diag(M) <- M[cbind(ind, 1:n)]
> M[cbind(ind, 1:n)] <- diags

produces
> M
     [,1] [,2] [,3]
[1,]   13    1    2
[2,]   10    9    7
[3,]   11    6   12


The diagonal is maximized, but the rows are no longer the same.  For
example, row 1 of the original matrix was 13 9 2, and in the second
matrix, it is 13 1 2.

I'm looking to conserve the rows, but only reorder them vertically.

Thanks,
Jonathan

On Fri, Apr 23, 2010 at 4:32 PM, Dimitris Rizopoulos
<d.rizopoulos at erasmusmc.nl> wrote:
> one way is:
>
> M <- matrix(sample(13, 9, TRUE), 3, 3)
>
> n <- ncol(M)
> ind <- apply(M, 2, which.max)
> maxs <- M[cbind(ind, 1:n)]
> diags <- diag(M)
> diag(M) <- M[cbind(ind, 1:n)]
> M[cbind(ind, 1:n)] <- diags
> M
>
>
> I hope it helps.
>
> Best,
> Dimitris
>
>
> On 4/23/2010 10:10 PM, Jonathan wrote:
>>
>> Hi r-help community,
>>     This question isn't so much a syntax/coding one, but here goes:
>>
>> Let's say I have matrix of arbitrary dimensions and I'd like to
>> reorder the rows in such a way that I could maximize the sum of the
>> entries along the diagonal.
>>
>> For example, for this 3x3 matrix:
>>
>>
>>      [,1] [,2] [,3]
>> [1,]    3    4   13
>> [2,]    9    1    2
>> [3,]    2   11    1
>>
>> rearranging the rows to maximize the sum along the diagonal would
>> produce this matrix:
>>
>>      [,1] [,2] [,3]
>> [1,]    9    1    2
>> [2,]    2   11    1
>> [3,]    3    4   13
>>
>>
>> I've been experimenting with some scripts of my own, but I figured I'd
>> ask if one of you R-ninjas might know of an existing function (or
>> algorithm I could look up and then code) that can do this somewhat
>> efficiently (or even just correctly!).
>>
>> Best,
>> Jonathan
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> --
> Dimitris Rizopoulos
> Assistant Professor
> Department of Biostatistics
> Erasmus University Medical Center
>
> Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
> Tel: +31/(0)10/7043478
> Fax: +31/(0)10/7043014
>



More information about the R-help mailing list