# [Rcpp-devel] Help with SubMatrix test case

Christian Gunning xian at unm.edu
Sat Dec 4 06:00:34 CET 2010

```> | The first three look correct to me:
> | i)   assign 3, 4, 5
> | ii)  copy row 0 as 1
> | iii) copy col 3 to 4
> |
> | but I am also a little puzzled by the last submatrix.
> |
> | I'm sure Romain will weigh in in a few hours.

> In the mean time, we can of course use the trusted Armadillo library and the
>
> R> src2 <- '
> +      NumericMatrix xx(4, 5);
> +      xx(0,0) = 3;
> +      xx(0,1) = 4;
> +      xx(0,2) = 5;
> +      xx(1,_) = xx(0,_);
> +      xx(_,3) = xx(_,2);
> +      arma::mat mm( xx.begin(), 4, 5, false );
> +      arma::mat sm = mm.submat(0,0,2,3);
> +      return(wrap(sm));
> +  '
> R> myfun2 <- cxxfunction( , src2, plugin='RcppArmadillo')
> R> aa2 <- myfun2()
> R> aa2
>     [,1] [,2] [,3] [,4]
> [1,]    3    4    5    5
> [2,]    3    4    5    5
> [3,]    0    0    0    0
> R>
>
> That looks more like it.
>

Interesting.  Here's a fully-formed example:

src3 <- '
int rr = 4, cc = 5;
List ret;
NumericMatrix xx(rr, cc);
RNGScope scope;
NumericVector zz = rnorm(rr*cc);
for (int i = 0; i<rr*cc; i++) {
xx[i] = zz[i];
}
xx(1,_) = xx(0,_);
xx(_,1) = xx(_,0);

ret["fullmat"] = xx;
NumericMatrix yy1 = xx( Range(0,2), Range(0,3) ) ;
ret["submat"] = yy1;

NumericVector zz2 = xx( _, 1);
ret["col"] = zz2;

arma::mat mm( xx.begin(), rr, cc, false );
arma::mat sm = mm.submat(0,0,2,3);
ret["arma"] = wrap(sm);
return(ret);
'

myfun3 <- cxxfunction( , src3, plugin='RcppArmadillo')
aa3 <- myfun3()

identical(aa3\$col, aa3\$fullmat[,2])
[1] TRUE
identical(aa3\$arma, aa3\$fullmat[1:3,1:4])
[1] TRUE
identical(aa3\$submat, aa3\$arma)
[1] FALSE

-christian

--
A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!
```