<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>