# [R] Looping over a matrix passed to .C

jim holtman jholtman at gmail.com
Thu Feb 12 02:51:40 CET 2009

```Given that there are 166,000,000,000 combinations, maybe you should
find some other way of partitioning the data.

On Wed, Feb 11, 2009 at 8:27 PM, Nathan S. Watson-Haigh
<nathan.watson-haigh at csiro.au> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> jim holtman wrote:
>> Why don't you generate all the possible combinations using 'combn' and
>
> I had thought of using this, however the size of data I'm using will more likely
> be orders of magnitude larger, such as:
>
>> dim(m)
> [1] 10000 10000
>
> Which takes looooong time to compute using:
> indx <- combn(10000, 3)
>
>
>
>>
>>> m <- matrix(1:25,5)
>>> indx <- combn(5, 3)
>>> indx
>>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
>> [1,]    1    1    1    1    1    1    2    2    2     3
>> [2,]    2    2    2    3    3    4    3    3    4     4
>> [3,]    3    4    5    4    5    5    4    5    5     5
>>
>>> mxy <- m[cbind(indx[1,], indx[2,])]
>>>
>>>
>>> mxy
>>  [1]  6  6  6 11 11 16 12 12 17 18
>>
>> You can use each of the columns as x,y,z values and compute everything at once.
>>
>> On Tue, Feb 10, 2009 at 9:49 PM, Nathan S. Watson-Haigh
>> <nathan.watson-haigh at csiro.au> wrote:
>> I've written a function in R which takes a symmetrical matrix as input and
>> processes all triplicate combinations of values from the matrix. The function
>> looks something like:
>>
>> my_fun <- function(m) {
>>  if( nrow(mat) != ncol(mat) ) {
>>    stop("'m' must be a square matrix")
>>  }
>>
>>  size <- nrow(m)
>>
>>  for(x in 1:(size -2)) {
>>    for(y in (x+1):(size -1)) {
>>      xy <- m[x,y]
>>
>>      for(z in (y+1):size ) {
>>        xz <- m[x,z]
>>        yz <- m[y,z]
>>
>>        # do something with xy, xz, yz
>>      }
>>    }
>>  }
>> }
>>
>> I'd like to speed this up since when size gets > a few thousand, I estimate it
>> would take 3yrs to complete the "do something" task. I could implement the "do
>> something" in C and have it called from within the nested for loops in R, but I
>> think I should get better performance if I implement the for loops in C as well.
>> As such, I'm trying to get my head around looping through matrix values when
>> passed to .C()
>>
>> As I understand it, once a matrix (n x m in size) is passed to .C() it is seen
>> as an unwrapped array of length n*m. Could someone help/guide me in implementing
>> this?
>>
>> Cheers,
>> Nathan
>>
>>
>>>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> and provide commented, minimal, self-contained, reproducible code.
>>>
>
> - --
> - --------------------------------------------------------
> Dr. Nathan S. Watson-Haigh
> OCE Post Doctoral Fellow
> CSIRO Livestock Industries
> Queensland Bioscience Precinct
> St Lucia, QLD 4067
> Australia
>
> Tel: +61 (0)7 3214 2922
> Fax: +61 (0)7 3214 2900
> Web: http://www.csiro.au/people/Nathan.Watson-Haigh.html
> - --------------------------------------------------------
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (MingW32)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
>
> iEYEARECAAYFAkmTeucACgkQ9gTv6QYzVL7dvwCaAgQKGrZOrsZF0nhn0qJo4Irx
> zYIAnAgxgHTqEnKe7dANNIqhmm0Hu6QY
> =iTyc
> -----END PGP SIGNATURE-----
>

--
Jim Holtman
Cincinnati, OH
+1 513 646 9390

What is the problem that you are trying to solve?

```