R 如何从两个矩阵中选择行并将其相乘

R 如何从两个矩阵中选择行并将其相乘,r,stan,rstan,R,Stan,Rstan,我试图循环两个矩阵中的行并将它们相乘,但每次尝试都会产生下面的第一个错误(很明显),以及最后两次尝试中关于维度不匹配的第二个错误。我试图将提取的行的格式更改为stan可以接受的格式,但我不知道如何将它们强制为相关格式。我如何选择行并将它们相乘 语法错误,来自解析器的消息: 没有匹配项: 行向量*行向量 表情不好 我的rstancode library("rstan") txt <- 'data { int<lower=0> N; int<

我试图循环两个矩阵中的行并将它们相乘,但每次尝试都会产生下面的第一个错误(很明显),以及最后两次尝试中关于维度不匹配的第二个错误。我试图将提取的行的格式更改为stan可以接受的格式,但我不知道如何将它们强制为相关格式。我如何选择行并将它们相乘

语法错误,来自解析器的消息:
没有匹配项:
行向量*行向量

表情不好



我的
rstan
code

library("rstan") 
txt <- 
  'data {
    int<lower=0> N;   
    int<lower=0> K;     
    int Ns;
    matrix[N, K] xnew;   
    matrix[Ns, K] beta;
  }
  parameters {
  }
  model {
  }
  generated quantities {
    matrix[Ns, N] yh;

    for(n in 1:N) {
      for(i in 1:Ns) {
//        yh[i, n] = xnew[n]* beta[i];
          yh[i, n] = xnew[n]* beta[i, ];
//        yh[i, n] = xnew[n]* row(beta, i);
//        yh[i, n] = xnew[n,]* row(beta, i);
//        yh[i, n] = to_vector(row(xnew, n))* to_matrix(row(beta, i));
//        yh[i, n] = to_vector(row(xnew, n))* row(beta, i);         
      }  
    }
  }

'
stan_model(model_code=txt) 
编辑:

这似乎起到了作用:

yh[i, n] = dot_product(row(xnew, n), row(beta, i));

但是,有没有一种方法可以在不遍历每一行的情况下计算这个值?(我什么也看不见)

嗯,我在这上面唱了一首歌,跳了一支舞。。。但是你可以使用矩阵乘法:
yh=beta*xnew'编辑:按照Bob在下面评论中的建议,我将矩阵转置移动到
转换数据

因此,完整代码:

txt <- 
  "data {
    int<lower=0> N;   
    int<lower=0> K;     
    int Ns;
    matrix[N, K] xnew;   
    matrix[Ns, K] beta;
  }
  transformed data{
    matrix[K, N] xnew_t = xnew';
  }
  parameters {
  }
  model {
  }
  generated quantities {
    matrix[Ns, N] yh;
    yh = beta* xnew_t;
  }

"

fit <- stan(model_code=txt,  data = list(beta=beta, xnew=xnew, Ns=10, N=2, K=3 ),    
            chains = 1, seed = 1, iter=1, algorithm = "Fixed_param")

ex_samp = as.matrix(fit)
all.equal(yh, matrix(ex_samp[-length(ex_samp)], nc=2))

txt嗯,我在这上面唱了一首歌,跳了一支舞。。。但是你可以使用矩阵乘法:
yh=beta*xnew'编辑:按照Bob在下面评论中的建议,我将矩阵转置移动到
转换数据

因此,完整代码:

txt <- 
  "data {
    int<lower=0> N;   
    int<lower=0> K;     
    int Ns;
    matrix[N, K] xnew;   
    matrix[Ns, K] beta;
  }
  transformed data{
    matrix[K, N] xnew_t = xnew';
  }
  parameters {
  }
  model {
  }
  generated quantities {
    matrix[Ns, N] yh;
    yh = beta* xnew_t;
  }

"

fit <- stan(model_code=txt,  data = list(beta=beta, xnew=xnew, Ns=10, N=2, K=3 ),    
            chains = 1, seed = 1, iter=1, algorithm = "Fixed_param")

ex_samp = as.matrix(fit)
all.equal(yh, matrix(ex_samp[-length(ex_samp)], nc=2))

txt对于
xnew
的转置,在转换的数据块中使用变量
xnew\t
会更快。否则,Stan必须分配,然后在每次迭代中进行复制。这还不算太糟糕,因为它只是每次迭代一次,而不是每次对数密度和梯度一次,并且它使用
double
算法而不是autodiff。在转换的数据块中使用变量
xnew\t
进行
xnew
的转置会更快。否则,Stan必须分配,然后在每次迭代中进行复制。这还不算太糟糕,因为它只是每次迭代一次,而不是每次对数密度和梯度一次,并且它使用
double
算法而不是autodiff。
txt <- 
  "data {
    int<lower=0> N;   
    int<lower=0> K;     
    int Ns;
    matrix[N, K] xnew;   
    matrix[Ns, K] beta;
  }
  transformed data{
    matrix[K, N] xnew_t = xnew';
  }
  parameters {
  }
  model {
  }
  generated quantities {
    matrix[Ns, N] yh;
    yh = beta* xnew_t;
  }

"

fit <- stan(model_code=txt,  data = list(beta=beta, xnew=xnew, Ns=10, N=2, K=3 ),    
            chains = 1, seed = 1, iter=1, algorithm = "Fixed_param")

ex_samp = as.matrix(fit)
all.equal(yh, matrix(ex_samp[-length(ex_samp)], nc=2))