<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.hoenzb
        {mso-style-name:hoenzb;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Courier New";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:3.0cm 2.0cm 3.0cm 2.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="DA" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Courier New";color:#1F497D">Thanks for the suggestions!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Courier New";color:#1F497D">Regards<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Courier New";color:#1F497D">Søren<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Courier New";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> rcpp-devel-bounces@lists.r-forge.r-project.org [mailto:rcpp-devel-bounces@lists.r-forge.r-project.org]
<b>On Behalf Of </b>John Merrill<br>
<b>Sent:</b> 19. februar 2013 02:46<br>
<b>To:</b> Dirk Eddelbuettel<br>
<b>Cc:</b> Rcpp-devel@lists.R-forge.R-project.org<br>
<b>Subject:</b> Re: [Rcpp-devel] Splitting a matrix by its rows into a list<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">There is a sleazy hack which works, but wastes a fair amount of memory: take the transpose of the matrix in R, and use the fact that the columns of that transpose are the rows of the original.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Mon, Feb 18, 2013 at 5:37 PM, Dirk Eddelbuettel <<a href="mailto:edd@debian.org" target="_blank">edd@debian.org</a>> wrote:<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
On 18 February 2013 at 17:02, Kevin Ushey wrote:<br>
| One solution: X.row(ii) is actually generating a CharacterMatrix::Row ; ie, a<br>
| view of that row in the CharacterMatrix, and I think you need to explicitly<br>
| copy it to a CharacterVector and then assign that CharacterVector to the list.<br>
|<br>
| You could write something like:<br>
|<br>
| src <- '<br>
|   CharacterMatrix X(XX_);<br>
|   int Nx = X.nrow();<br>
|   List ans;<br>
|   for (int ii=0; ii<Nx; ii++) {<br>
|     CharacterMatrix::Row view = X.row(ii);<br>
|     CharacterVector tmp = no_init( X.ncol() );<br>
|     for( int j=0; j < X.ncol(); j++ ) {<br>
|       tmp[j] = view[j];<br>
|     }<br>
|     ans.push_back( tmp );<br>
|   }<br>
|   return(wrap(ans));<br>
| ' <br>
|<br>
| although it is a bit clunkier. I'm not sure if there's a more idiomatic method<br>
| available.<o:p></o:p></p>
</div>
<p class="MsoNormal">I think all approaches have to be clunky as all our data structures store<br>
column-wise, because that is what R does.<br>
<br>
So I would probably start by element-wise copying, see if that works / if<br>
that is fast enough and leave it at that.<br>
<br>
Dirk<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal">|<br>
| FWIW, trying to copy and assign directly, e.g. 'CharacterVector tmp = X.row<br>
| (ii);', doesn't seem to work, even though the same code works (and is in the<br>
| quick-start vignette) for NumericVector.<br>
|<br>
| -Kevin<br>
|<br>
| On Mon, Feb 18, 2013 at 3:37 PM, Søren Højsgaard <<a href="mailto:sorenh@math.aau.dk">sorenh@math.aau.dk</a>> wrote:<br>
|<br>
|     I want to split a matrix by its rows into a list as:<br>
|     > a<- matrix(letters[1:6],ncol=2)<br>
|     > split(a,row(a))<br>
|     $`1`<br>
|     [1] "a" "d"<br>
|<br>
|     $`2`<br>
|     [1] "b" "e"<br>
|<br>
|     $`3`<br>
|     [1] "c" "f"<br>
|<br>
|     I do as follows and get a strange result. Any suggestions?<br>
|<br>
|     Thanks in advance!<br>
|     Søren<br>
|<br>
|     ---------------<br>
|<br>
|     src <- '<br>
|       CharacterMatrix X(XX_);<br>
|       int Nx = X.nrow();<br>
|       List ans;<br>
|       for (int ii=0; ii<Nx; ii++){<br>
|         ans.push_back(X.row(ii));<br>
|       }<br>
|       return(wrap(ans));<br>
|     '<br>
|     split_ <- cxxfunction(signature(XX_="matrix"), plugin="Rcpp", body=src)<br>
|<br>
|     split_(a)<br>
|<br>
|     [[1]]<br>
|     [[1]][[1]]<br>
|     <CHARSXP: "a"><br>
|<br>
|     [[1]][[2]]<br>
|     <CHARSXP: "d"><br>
|<br>
|<br>
|     [[2]]<br>
|     [[2]][[1]]<br>
|     <CHARSXP: "b"><br>
|<br>
|     [[2]][[2]]<br>
|     <CHARSXP: "e"><br>
|<br>
|<br>
|     [[3]]<br>
|     [[3]][[1]]<br>
|     <CHARSXP: "c"><br>
|<br>
|     [[3]][[2]]<br>
|     <CHARSXP: "f"><br>
|<br>
|<br>
|     _______________________________________________<br>
|     Rcpp-devel mailing list<br>
|     <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
|     <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
|<br>
|<br>
|<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal">| ----------------------------------------------------------------------<o:p></o:p></p>
<div>
<p class="MsoNormal">| _______________________________________________<br>
| Rcpp-devel mailing list<br>
| <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
| <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><span class="hoenzb"><span style="color:#888888">--</span></span><span style="color:#888888"><br>
<span class="hoenzb">Dirk Eddelbuettel | <a href="mailto:edd@debian.org">edd@debian.org</a> |
<a href="http://dirk.eddelbuettel.com" target="_blank">http://dirk.eddelbuettel.com</a></span></span><o:p></o:p></p>
<div>
<div>
<p class="MsoNormal">_______________________________________________<br>
Rcpp-devel mailing list<br>
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><o:p></o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>