如何 select 来自两个矩阵的行并将它们相乘

How to select rows from two matrices and multiply them

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

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
No matches for:
row_vector * row_vector

Expression is ill formed.


16:       for(i in 1:Ns) {
17: //        yh[i, n] = xnew[n]* beta[i];
18:         yh[i, n] = xnew[n]* beta[i, ];
                                        ^
19: //        yh[i, n] = xnew[n]* row(beta, i);

我的rstan代码

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) 

为清楚起见,这是我在 base R 中尝试做的事情

set.seed(1)
Ns=10; N=2; K=3
beta = matrix(rnorm(Ns*K), ncol=K)
xnew = matrix(rnorm(N*K), ncol=K)

yh=matrix(nr=Ns, nc=N)
for(n in 1:N) {
  for(i in 1:Ns) {
    p = as.numeric(xnew[n, , drop=FALSE] %*% beta[i,])
    yh[i, n] = p
  }  
}

#tcrossprod(beta, xnew)

编辑:

这似乎可以解决问题:

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

但是有没有一种方法可以在不遍历每一行的情况下进行计算? (我在 https://mc-stan.org/docs/2_18/functions-reference/dot-products-and-specialized-products.html 看不到任何东西)

好吧,我为此做了一个歌舞......但你可以只使用矩阵乘法:yh = beta* xnew'; 编辑:按照 Bob 在下面评论中的建议,我将矩阵转置移动到 transformed data块。

所以完整代码:

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

相关文档:https://mc-stan.org/docs/2_18/functions-reference/matrix-arithmetic-operators.html