在 Stan 中不可能将 matrices/vectors 乘以标量值吗?

Is it impossible to multiply matrices/vectors by scalar values in Stan?

考虑以下我通过 RStan 使用的 Stan 脚本:

data {
  int K; //outcome classes
  int N; //rows
  int D; //input dimensions
  int y[N];
  matrix[N, D] X;
  real days[N]; 
}
parameters {
  matrix[D, K] C;
  matrix[D, K] B;
}
model {
  matrix[N, K] pred = X*C + days*X*B; //If I remove days, it works fine. 

  to_vector(pred) ~ normal(0, 5);

  for (n in 1:N)
    y[n] ~ categorical_logit(pred[n]');
}

一个不受欢迎的解决方案是复制 R 中的天数列,使其成为一个矩阵并可用于矩阵乘法。但这真的有必要吗?通过标量值“缩放”矩阵应该很容易。

错误是:

编辑:我还将天数转换为矩阵 matrix[N,1] days[N]。虽然这确实通过了“清理”,但由于维度不匹配,它在编译时被拒绝。

Edit2:我调整了代码,现在可以执行了。但是我很困惑为什么这个嵌套的 for 循环是必要的。应该有一种简单的方法可以将所有向量元素乘以相同的标量值。

data {
  int K; //outcome classes, 3
  int N; //num rows
  int D; //input dimensions, 5
  int Y[N];
  matrix[N,D] X;
  int days[N]; 
}
parameters {
  matrix[D, K] C; //[5,3] 
  matrix[D, K] B; //[5,3]
}
model {
  for (n in 1:N){
    vector[K] pred;
    vector[D] ipt;
    matrix[K,K] day_diag;
    for (i in 1:K){
      for (j in 1:K){
        if (i == j)
          day_diag[i,j] = days[n];
        else
          day_diag[i,j] = 0; 
      }
    }
    
    ipt = X[n]'; // now row_vector [1xD]
    // [D,K] x [1,D] + [D,K] x [1,D]  
    pred = C * ipt   +  B * (day_diag * ipt); 
    Y[n]~categorical_logit(pred);   
  }
}

要按向量的相应值缩放矩阵的每一行,可以使用diag_pre_multiply(),所以它会是diag_pre_multiply(days, B)。 days 需要读入 vector[N] days 而不是真实的。

顺便说一句,Stan 定义了大量矩阵运算,请参阅:https://mc-stan.org/docs/2_25/functions-reference/matrix-operations.html