Varget inside a loop for structure items

Good night,

I have the following item in a estructure:

U.U_1np_2np_pp;

U.U_1np_2np_pf;

U.U_1np_2np_fp;

U.U_1np_2np_ff;

Then I have another processes to do and I want to systematise it. If I just write their names in the output it will print their values. But if I want to obtain their values using a loop with varget:

for hh_Ma (1,2,1);

    for hh_Fe (1,2,1);

        Utility =varget(U."U_1np_2np_"$+hh_prod[hh_Ma]$+hh_prod[hh_Fe]);

    endfor;

endfor;

the following mistake arises:  G0504 : Invalid structure member

If I try the following

for hh_Ma (1,2,1);

    for hh_Fe (1,2,1);

        Utility =varget("U.U_1np_2np_"$+hh_prod[hh_Ma]$+hh_prod[hh_Fe]);

    endfor;

endfor;

This mistake shows up: G0025 : Undefined symbol 'U.U_1np_2np_pp'

 

How can I code this?

Thank you so much

1 Answer



0



It is usually best practice to avoid the use of varget. varget does not support the retrieval of structures or structure members. I think you would be much better off creating a vector or matrix of structure members and referencing with normal indexing. I do not know exactly what is in your structure, but here is the general concept

//Define structures
struct Udata {
    matrix data;
};
struct mystruct {
    struct Udata U_1np_2np;
};

//Declare 'U' to be a 'mystruct' instance
struct mystruct U;

//Reshape the 'U_1np_2np' member into an array of structures
U.U_1np_2np = reshape(U.U_1np_2np, 2, 2);

//fill in data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        U.U_1np_2np[i,j].data = i  + j / 10;
    endfor;
endfor;

//Extract data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        Utility = U.U_1np_2np[i,j].data ;
    endfor;
endfor;

and if it is helpful to have the pf, pp, ff, fp information, you can add that to the substruct like this

//Make sure to clear workspace since we are changing
//the definition of the 'Udata' struct
new;

//Define structures
struct Udata {
    matrix data;
    string name;
};
struct mystruct {
    struct Udata U_1np_2np;
};

//Declare 'U' to be a 'mystruct' instance
struct mystruct U;

//Reshape the 'U_1np_2np' member into an array of structures
U.U_1np_2np = reshape(U.U_1np_2np, 2, 2);

names = ("pp" $~ "pf") $| ("fp" $~ "ff");

//fill in data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        U.U_1np_2np[i,j].data = i  + j / 10;
        U.U_1np_2np[i,j].name = names[i,j];
    endfor;
endfor;

//Extract data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        Utility = U.U_1np_2np[i,j].data ;
    endfor;
endfor;

aptech

1,773

Your Answer

1 Answer

0

It is usually best practice to avoid the use of varget. varget does not support the retrieval of structures or structure members. I think you would be much better off creating a vector or matrix of structure members and referencing with normal indexing. I do not know exactly what is in your structure, but here is the general concept

//Define structures
struct Udata {
    matrix data;
};
struct mystruct {
    struct Udata U_1np_2np;
};

//Declare 'U' to be a 'mystruct' instance
struct mystruct U;

//Reshape the 'U_1np_2np' member into an array of structures
U.U_1np_2np = reshape(U.U_1np_2np, 2, 2);

//fill in data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        U.U_1np_2np[i,j].data = i  + j / 10;
    endfor;
endfor;

//Extract data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        Utility = U.U_1np_2np[i,j].data ;
    endfor;
endfor;

and if it is helpful to have the pf, pp, ff, fp information, you can add that to the substruct like this

//Make sure to clear workspace since we are changing
//the definition of the 'Udata' struct
new;

//Define structures
struct Udata {
    matrix data;
    string name;
};
struct mystruct {
    struct Udata U_1np_2np;
};

//Declare 'U' to be a 'mystruct' instance
struct mystruct U;

//Reshape the 'U_1np_2np' member into an array of structures
U.U_1np_2np = reshape(U.U_1np_2np, 2, 2);

names = ("pp" $~ "pf") $| ("fp" $~ "ff");

//fill in data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        U.U_1np_2np[i,j].data = i  + j / 10;
        U.U_1np_2np[i,j].name = names[i,j];
    endfor;
endfor;

//Extract data
for i(1, rows(U.U_1np_2np), 1);
    for j(1, cols(U.U_1np_2np), 1);
        Utility = U.U_1np_2np[i,j].data ;
    endfor;
endfor;


You must login to post answers.

Have a Specific Question?

Get a real answer from a real person

Need Support?

Get help from our friendly experts.