MATLAB Answers

For loop error: unable to perform assignment because left and right sides have a different number of elements

59 views (last 30 days)
matlabuser on 26 Dec 2020
Commented: matlabuser on 30 Dec 2020
I am struggling to create a forloop which reduces the following task into a few lines of code:
resp1 = squeeze(resp(:,1,:));
resp2 = squeeze(resp(:,2,:));
resp3 = squeeze(resp(:,3,:));
resp4 = squeeze(resp(:,4,:));
resp5 = squeeze(resp(:,5,:));
resp6 = squeeze(resp(:,6,:));
resp7 = squeeze(resp(:,7,:));
imp_level(iter_rep-num_draw_discard,:,:) = resp1;
imp_slope(iter_rep-num_draw_discard,:,:) = resp2;
imp_curv(iter_rep-num_draw_discard,:,:) = resp3;
imp_unrate(iter_rep-num_draw_discard,:,:) = resp4;
imp_pce_ch(iter_rep-num_draw_discard,:,:) = resp5;
imp_tcu_ch(iter_rep-num_draw_discard,:,:) = resp6;
imp_effr(iter_rep-num_draw_discard,:,:) = resp7;
I've tried the following but got an error
variables = {'level', 'slope', 'curv', 'unrate', 'pce_ch','tcu_ch', 'effr' };
range = linspace(1,size(variables,2),7);
% betas_exog is a (324 x 7) dimension matrix
for i = 1:size(betas_exog, 2)
resp_range(i) = squeeze(resp(:,i,:));
imp_variables{i}(iter_rep-num_draw_discard,:,:) = resp(i)
I would appreciate your help in fixing the error and creating a workable for loop.


Show 3 older comments
Stephen Cobeldick
Stephen Cobeldick on 27 Dec 2020
This won't work, it will not generate variable names like "imp_level" as your example shows:
variables = {'level', 'slope', 'curv', 'unrate', 'pce_ch','tcu_ch', 'effr' };
In any case, that approach is entirely wrong, unless you want to force yourself into writing slow, complex, inefficient, obfuscated code which is buggy and difficult to debug:
Instead of trying to access variable names dynamically, the much more efficient approach would be to use structure fields or a table. Or perhaps best of all: just leave the data and meta-data unchanged and access them using indexing. Or if you have a fixed, small number of such allocations, just write them out explicitly.
J. Alex Lee
J. Alex Lee on 28 Dec 2020
Are you just trying to re-order the dimensions? Or would doing that first let you index more easily for whatever you are trying to do?
matlabuser on 30 Dec 2020
i was trying to just create a set of variables as defined above. To clarify, num_draw_discard is a scaler = 3000, iter_rep = 15,000.

Sign in to comment.

Accepted Answer

Gaurav Garg
Gaurav Garg on 29 Dec 2020
You can plan to use either Structure array, or a Cell array. You could have also constructed variable name from string, however, the potential risks for it have already been pointed out, about which you can also look here.
The error which you are getting is usually caused when the dimensions of the assigner and the assignee variables are not the same/equal.
As the last option, you can look at Map Containers. They are the objects with keys that index to values, and at the same time, the keys need not be integers

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!