# Initialize array of matrices parameter with 0 diagonals

I would like to initialize an array of size K of matrixes of size QxK where for the kth element of the array, the kth column of the matrix is 0. So far I’ve tried initializing a vector of size QK(K-1) and then create a new array in the transformed parameter block that I fill as I want but that fails because I can’t slice the original vector of parameters properly. Is there any easy fix to this for Q>0 and K > 1? I attached an example for reference! Thanks! 22%20PM|547x499

Does simple for loop work?

``````matrix[Q,K] X[K];
for (k in 1:K) {
for (q in 1:Q) {
X[k,q,k] = 0;
}
}
``````
1 Like

To my knowledge, I can’t overwrite elements of a parameter object in the transformed parameters block. I may be wrong though. Something I did consider was to initialize

``````parameters {
matrix[Q, K] lambda[K];
}

transformed parameters {
matrix[Q,K] lambda_prime[K];
lambda_prime = lambda;
for (k in 1:K) {
for (q in 1:Q) {
lambda_prime[k,q,k] = 0;
}
}
``````

but then there would be K parameters that would just float freely and this seems like a less than ideal solution.

For problems like this, I just initialize a vector with as many elements as I actually need. Then ‘unroll’ them into the shape I need in transformed parameters.

As in, vector in parameters{}, then matrix in transformed parameters {}. Then loop over the matrix elements, adding each vector element where they should go. Something like:

``````int count = 1;
for(i in 1:I){
for(j in 1:J){
if(i == j){mat[i,j] == 0}
else {
mat[i,j] = vec[count]; count += 1;
}
}
}
``````
1 Like

Thanks. My bad. I tried that but started with:

``````transformed parameters {
int counter;
counter = 1;
}
``````

which threw the error: “Parameters or transformed parameters cannot be integer or integer array; found int variable declaration, name=counter”. I will try that. Thanks a lot!

Ah, you need to do it within another scope.

``````transformed parameters {
matrix[dims,here] mat;
{
int count = 1;
putForloopHere
}
}
``````
1 Like

This seems to have worked (at least it doesn’t throw any errors yet).

``````parameters {
vector[Md_var * K * (K - 1)] lambda;
}
transformed parameters {
matrix[Md_var, K] lambda_prime[K];
{
int count = 1;
for (i in 1:K){
for (j in 1:K){
for (q in 1:Md_var){
if (i == j){
lambda_prime[i, q, j] = 0;
} else {
lambda_prime[i, q, j] = lambda[count]; count += 1;
}
}
}
}
}
}
``````
3 Likes