Я пытаюсь провести l oop по строкам в двух матрицах и умножить их, но каждая попытка приводит к появлению первой ошибки ниже, которая очевидна, и второй ошибки несоответствия размеров из последних двух попыток. Я попытался изменить формат извлеченных строк на форму, приемлемую для stan, но я не знаю, как привести их к соответствующему формату. Как мне выбрать строки и умножить их, пожалуйста?
СИНТАКСИЧЕСКАЯ ОШИБКА, СООБЩЕНИЕ ОТ ПАРСЕРА:
Нет совпадений для:
row_vector * row_vector
Выражение плохо сформирован.
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)
Для ясности это то, что я пытаюсь сделать на базе 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)