<div dir="ltr"><div><div><div>Waoooo. Impressive----I have tried it. It is giving the same answer I want.<br></div>Now I learn it step by step how you did that. It is very different concept from what I was using in rcpp.<br></div>Thank you so very much Avraham.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 27, 2016 at 4:52 PM, Avraham Adler <span dir="ltr"><<a href="mailto:avraham.adler@gmail.com" target="_blank">avraham.adler@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello, Amina.<br>
<br>
It is much, much, much easier to deal with small, simplified,<br>
examples, as Dirk and others have explained before. Changing your code<br>
to make n = 4 and the values seq(1, 12), we can see the pattern. For<br>
each slice, you are taking the product down the rows of "slice" number<br>
of entries. So the first slice is the 1-element product of the<br>
entries, or just a copy of the original matrix. Now, putting the index<br>
names back in familiar context (M rows and N columns), for the second<br>
slice, C(2, 1, 2) = A(1, 1) * A(2, 1). C(3, 1, 2) = A(2, 1) * A(3, 1),<br>
etc. For the third slice, we have 3-element products So C(1, , 3) and<br>
C(2, , 3) are 0. C(3, 1, 3) = A(1, 1) * A(2, 1) * A(3, 1), etc. In the<br>
last slice there is only one entry in the last row and it is the<br>
product of each column in its entirety.<br>
<br>
That being said, the way I would approach it is to use Armadillo's<br>
subsetting to get the needed vector and use Armadillo's product<br>
function to get their product.<br>
<br>
First, we'll turn your fixed R code into a function which we can reuse<br>
by creating any a you want and passing it to up_R<br>
<br>
up_R <- function(a){<br>
  m = dim(a)[[1]]<br>
  n = dim(a)[[2]]<br>
  b = array(as.double(0), dim = c(m, n, m))<br>
  for(i in 1:m){<br>
    for(j in 1:n){<br>
<span class="">      for(q in 1:i){<br>
        if(q==1){<br>
          b[i, j, q] = a[i, j];<br>
        }<br>
        else{<br>
          b[i, j, q] = b[i-1, j, q-1] * a[i, j];<br>
        }<br>
      }<br>
    }<br>
  }<br>
</span>  return(b)<br>
}<br>
<br>
The way I would approach the problem from first principles, knowing<br>
what you actually intended, is as follows:<br>
<span class=""><br>
#include <RcppArmadillo.h><br>
using namespace Rcpp;<br>
using namespace RcppArmadillo;<br>
</span>using namespace arma;<br>
<span class="">//[[Rcpp::depends(<wbr>RcppArmadillo)]]<br>
<br>
//[[Rcpp::export]]<br>
</span>cube up_C(mat a){<br>
  int m = a.n_rows;<br>
  int n = a.n_cols;<br>
  cube C = cube(m, n, m, fill::zeros);<br>
  C.slice(0) = a;<br>
  for (int slices = 1; slices < m; ++slices){<br>
    for (int j = 0; j < n; ++j) {<br>
      for (int i = slices; i < m; ++i) {<br>
        vec S = C.subcube(i - slices, j, 0, i, j, 0);<br>
        C(i, j, slices) = prod(S);<br>
      }<br>
    }<br>
  }<br>
  return(C);<br>
}<br>
<br>
This pulls the "slices" length subset of the jth column starting at<br>
slices and ending at i from the 0th slice (which is the original<br>
matrix) and puts the product in to the C(i, j, slices) entry.<br>
<br>
You can test the two are identical through identical(up_C(a), up_R(a))<br>
for any a, and the C version is, of course, much faster especially for<br>
large matrices.<br>
<br>
It often pays to start with something simpler, and see if there is a<br>
pattern you can identify which would help you conceptually, even if<br>
not completely optimized.<br>
<br>
Avi<br>
<br>
<br>
<br>
<br>
On Mon, Sep 26, 2016 at 10:31 PM, Amina Shahzadi<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:aminashahzadi@gmail.com">aminashahzadi@gmail.com</a>> wrote:<br>
> Hi Dear<br>
> This is the corresponding R code which I want to have the same result from<br>
> rcpp code.<br>
><br>
> set.seed(11)<br>
> a = matrix(runif(30), nrow=10, ncol=3)<br>
> n=10<br>
> m=3<br>
> b = array(as.double(0), dim = c(n, m, n))<br>
> for(i in 1:n){<br>
>   for(j in 1:m){<br>
>     for(q in 1:i){<br>
>       if(q==1){<br>
>         b[i, j, q] = a[i, j];<br>
>       }<br>
>       else{<br>
>         b[i, j, q] = b[i-1, j, q-1] * a[i, j];<br>
>       }<br>
>     }<br>
>   }<br>
> }<br>
><br>
><br>
> On Tue, Sep 27, 2016 at 3:22 PM, Avraham Adler <<a href="mailto:avraham.adler@gmail.com">avraham.adler@gmail.com</a>><br>
> wrote:<br>
>><br>
>> Please give a simple example of an input and its expected output.<br>
>> Unfortunately "run of a variable for loop" is too general for me to<br>
>> understand.<br>
>><br>
>> Avi<br>
>><br>
>> On Mon, Sep 26, 2016 at 10:07 PM, Amina Shahzadi<br>
>> <<a href="mailto:aminashahzadi@gmail.com">aminashahzadi@gmail.com</a>> wrote:<br>
>> > Hi Dear<br>
>> ><br>
>> > My purpose is to make run of a variable for loop. Here I have assumed<br>
>> > else<br>
>> > statement to be zero. Otherwise it could be anything for example in the<br>
>> > following code.<br>
>> > In this code, my main aim to run the slices loop according to rows.<br>
>> > does it now look ok?<br>
>> ><br>
>> ><br>
>> > Thank you<br>
>> ><br>
>> > #include <RcppArmadillo.h><br>
>> > using namespace Rcpp;<br>
>> > using namespace RcppArmadillo;<br>
>> > //[[Rcpp::depends(<wbr>RcppArmadillo)]]<br>
>> > //[[Rcpp::export]]<br>
>> > arma::cube up(arma::mat a){<br>
>> >   int m = a.n_cols;<br>
>> >   int n = a.n_rows;<br>
>> >   int p = a.n_rows;<br>
>> >   arma::cube b(n, m, p);<br>
>> >   for(int i=0; i<n; i++){<br>
>> >       for(int j=0; j<m; j++){<br>
>> >         for(int q=0; q<i; q++){<br>
>> >          if(q==0){<br>
>> >            b(i, j, q) = a(i, j);<br>
>> >          }<br>
>> >          else{<br>
>> >            b(i, j, q) = b(i-1, j, q-1) * a(i, j);<br>
>> >          }<br>
>> >       }<br>
>> >     }<br>
>> >   }<br>
>> >   return b;<br>
>> > }<br>
>> ><br>
>> > On Tue, Sep 27, 2016 at 2:51 PM, Avraham Adler <<a href="mailto:avraham.adler@gmail.com">avraham.adler@gmail.com</a>><br>
>> > wrote:<br>
>> >><br>
>> >> Hello.<br>
>> >><br>
>> >> Once again, it is very unclear what you want to do. Can you please<br>
>> >> explain, in English not code what your procedure intends to do, the<br>
>> >> input you expect, and the output you expect?<br>
>> >><br>
>> >> What it LOOKS like you want to do is to create an N x M x N cube where<br>
>> >> the first slice is your matrix and the remaining slices are all 0. If<br>
>> >> that is the case, There are much, much simpler ways to do it than to<br>
>> >> traverse all N²M cells. The following should work.<br>
>> >><br>
>> >> #include <RcppArmadillo.h><br>
>> >> using namespace Rcpp;<br>
>> >> using namespace RcppArmadillo;<br>
>> >> //[[Rcpp::depends(<wbr>RcppArmadillo)]]<br>
>> >><br>
>> >> //[[Rcpp::export]]<br>
>> >> arma::cube fillup(arma::mat a){<br>
>> >>   int m = a.n_cols;<br>
>> >>   int n = a.n_rows;<br>
>> >>   arma::cube C = arma::cube(n, m, n, arma::fill::zeros);<br>
>> >><br>
>> >>   C.slice(0) = a;<br>
>> >><br>
>> >>   return(C);<br>
>> >> }<br>
>> >><br>
>> >> Avi<br>
>> >><br>
>> >> On Mon, Sep 26, 2016 at 5:59 PM, Amina Shahzadi<br>
>> >> <<a href="mailto:aminashahzadi@gmail.com">aminashahzadi@gmail.com</a>><br>
>> >> wrote:<br>
>> >> > Hi Dear<br>
>> >> ><br>
>> >> > I have a problem in using a variable for loop in using RcppArmadillo<br>
>> >> > library.<br>
>> >> > I have pasting here my code. It is executing but not giving the same<br>
>> >> > results<br>
>> >> > as its R code version gives. The results produced by it are really<br>
>> >> > weird. I<br>
>> >> > have checked it step by step. It is because of the for (int q=0; q<i;<br>
>> >> > q++).<br>
>> >> > I request tp please help how to handle it in cpp.<br>
>> >> ><br>
>> >> > The another question is I want to multiply the cube b(i, ,) by a<br>
>> >> > scalar.<br>
>> >> > How<br>
>> >> > can we consider the entire columns and slices of a cube for each of<br>
>> >> > the<br>
>> >> > rows.  "b(span(i), span(), span())"  is not working for me.<br>
>> >> ><br>
>> >> > Thank you<br>
>> >> ><br>
>> >> > #include <RcppArmadillo.h><br>
>> >> > using namespace Rcpp;<br>
>> >> > using namespace RcppArmadillo;<br>
>> >> > //[[Rcpp::depends(<wbr>RcppArmadillo)]]<br>
>> >> > //[[Rcpp::export]]<br>
>> >> > arma::cube up(arma::mat a){<br>
>> >> >   int m = a.n_cols;<br>
>> >> >   int n = a.n_rows;<br>
>> >> >   int p = a.n_rows;<br>
>> >> >   arma::cube b(n, m, p);<br>
>> >> >   for(int i=0; i<n; i++){<br>
>> >> >       for(int j=0; j<m; j++){<br>
>> >> >         for(int q=0; q<i; q++){<br>
>> >> >          if(q==0){<br>
>> >> >            b(i, j, q) = a(i, j);<br>
>> >> >          }<br>
>> >> >          else{<br>
>> >> >            b(i, j, q) = 0.0;<br>
>> >> >          }<br>
>> >> >       }<br>
>> >> >     }<br>
>> >> >   }<br>
>> >> >   return b;<br>
>> >> > }<br>
>> >> ><br>
>> >> > --<br>
>> >> > Amina Shahzadi<br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> > --<br>
>> > Amina Shahzadi<br>
><br>
><br>
><br>
><br>
> --<br>
> Amina Shahzadi<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><em><font face="comic sans ms,sans-serif">Amina Shahzadi</font></em></div>
</div>