[Rcpp-devel] Regression in conversion from NumericVector to ComplexVector?
Christian Gunning
xian at unm.edu
Wed Dec 22 06:23:42 CET 2010
The so-simple-i-missed it fix to my original question is here, though
i'm not quite sure how/why:
test1 = cxxfunction(, '
NumericVector aa(10, 1.5);
// bb = aa // first attempt
ComplexVector bb(aa); // working
return(bb);
', plugin='Rcpp'
)
> Just to follow up some more: I just played with a few lines of Armadillo
> code and it seems pretty clear. To create a complex matrix, you need two
> standard ones. So no implicit conversions.
Thanks for the example. I'm focusing on ComplexVector right now, but
it's an interesting comparison - essentially opposite of ComplexVector
(as above).
> Now, on a strictly personal level: I haven't had a use case for complex
> numbers since the last time it came up in graduate school, so I am unlikely
> to push this cart very far for you.
Understood. I use them regularly doing frequency-domain work. I'm
starting to understand the Rcomplex-sugar interface, and I'm happy to
work on it.
A few unit tests of instantiating a ComplexVector are attached. I
also discovered the following strange bug where a complex-valued
function changes its argument.
test1 = cxxfunction(signature(vec='complex'), '
ComplexVector x(vec) ;
int nn = x.size();
for( int i=0; i<nn; i++) {
x[i].r = x[i].r*2 ;
x[i].i = x[i].i*2 ;
}
return x ;
', plugin='Rcpp')
aa1 = (0:9)*(1+1i)
aa2 = (0:9)*(1+1i)
all.equal(aa1,aa2) ## true
bb = test1(aa1)
all.equal(aa1,aa2) ## false
-------------- next part --------------
Index: runit.Vector.R
===================================================================
--- runit.Vector.R (revision 2803)
+++ runit.Vector.R (working copy)
@@ -95,21 +95,41 @@
return x ;
'
),
- "complex_INTSXP" = list(
+ "complex_CPLXSXP" = list(
signature(vec = "complex" ),
'
ComplexVector x(vec) ;
- for( int i=0; i<x.size(); i++) {
+ int nn = x.size();
+ for( int i=0; i<nn; i++) {
x[i].r = x[i].r*2 ;
x[i].i = x[i].i*2 ;
}
return x ;
'
),
+ "complex_INTSXP" = list(
+ signature(vec = "integer" ),
+ '
+ ComplexVector x(vec);
+ int nn = x.size();
+ IntegerVector tmp(nn, 2.0);
+ ComplexVector tmp1(tmp);
+ x = x * tmp1;
+ return x ;
+ '
+ ),
+ "complex_REALSXP" = list(
+ signature(vec = "numeric" ),
+ '
+ ComplexVector x(vec);
+ int nn = x.size();
+ NumericVector tmp(nn, 3.0);
+ ComplexVector tmp1(tmp);
+ x = x * tmp1;
+ return x ;
+ '
+ ),
-
-
-
"integer_ctor"=list(
signature(),
'IntegerVector x(10) ;
@@ -727,11 +747,22 @@
funx <- .rcpp.Vector$complex_
checkEquals( funx(), 0:9*(1+1i), msg = "ComplexVector" )
}
-
+test.ComplexVector.CPLXSXP <- function(){
+ funx <- .rcpp.Vector$complex_CPLXSXP
+ vv = (0:9)*(1+1i) ## not working - funx changes its argument
+ #checkEquals( funx(vv), 2*vv, msg = "ComplexVector( CPLXSXP) " )
+ checkEquals( funx((0:9)*(1+1i)), 2*(0:9)*(1+1i), msg = "ComplexVector( CPLXSXP) " )
+}
test.ComplexVector.INTSXP <- function(){
funx <- .rcpp.Vector$complex_INTSXP
- checkEquals( funx(0:9*(1+1i)), 2*0:9*(1+1i), msg = "ComplexVector( CPLXSXP) " )
+ vv <- 0L:9L
+ checkEquals( funx(vv), (2+0i)*vv, msg = "ComplexVector( INTSXP) " )
}
+test.ComplexVector.REALSXP <- function(){
+ funx <- .rcpp.Vector$complex_REALSXP
+ vv <- as.numeric(0:9)
+ checkEquals( funx(vv), (3+0i)*vv, msg = "ComplexVector( REALSXP) " )
+}
if( Rcpp:::capabilities()[["initializer lists"]] ){
test.ComplexVector.initializer.list <- function(){
funx <- .rcpp.Vector$complex_initializer_list
More information about the Rcpp-devel
mailing list