如何 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
我试图循环遍历两个矩阵中的行并将它们相乘,但每次尝试都会产生下面的第一个错误,这很明显,以及最后两次尝试的维度不匹配的第二个错误。我试图将提取的行的格式更改为 stan 可以接受的格式,但我不知道如何将它们强制转换为相关格式。请问如何 select 行并将它们相乘?
SYNTAX ERROR, MESSAGE(S) FROM PARSER:
No matches for:
row_vector * row_vectorExpression 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