# I am getting this error "The right and left hand sides must have the same number of elements" while computing g(i)

23 views (last 30 days)
RENJITH K on 20 Jan 2022
Commented: _ on 9 Feb 2022
function [Sa,Sb,Sc]= control(xhatout,Vo_meas,v_ref,If_k)
% Sampling time of the predictive algorithm [s]
Ts = 33e-6;
%f = 50*(2*pi); % frequency [rad/s]
Vdc = 700; % DC-link voltage [V]
L = 2e-3;
C = 50e-6;
% Voltage vectors
v0 = 0;
v1 = 2/3*Vdc;
v2 = 1/3*Vdc + 1j*sqrt(3)/3*Vdc;
v3 = -1/3*Vdc + 1j*sqrt(3)/3*Vdc;
v4 = -2/3*Vdc;
v5 = -1/3*Vdc - 1j*sqrt(3)/3*Vdc;
v6 = 1/3*Vdc - 1j*sqrt(3)/3*Vdc;
v7 = 0;
v = [v0 v1 v2 v3 v4 v5 v6 v7];
% Switching states
states = [0 0 0;1 0 0;1 1 0;0 1 0;0 1 1;0 0 1;1 0 1;1 1 1];
% Previous Optimum vector and measured current at instant k-1
persistent x_old i_old v_old
% Initialize values
if isempty(x_old), x_old = 1; end
if isempty(i_old), i_old = 0+1j*0; end
if isempty(v_old), v_old = 0+1j*0;end
g = zeros(2,8);
% Read current reference inputs at sampling instant k
vk_ref = v_ref(1) + 1j*v_ref(2);
vk = Vo_meas(1) + 1j*Vo_meas(2);
io = [0 0 1]*xhatout;
for i = 1:8
% Cost function
vi = Vdc*x_old;
if_k1 = If_k+((Ts/L)*(vi-Vo_meas));
vc_k1 = vk+((Ts/C)*(If_k-io));
g(i) = abs(real(v_ref - vc_k1)) + abs(imag(v_ref - vc_k1));
end
% Optimization
[~,x_opt] = min(g);
% Store the present value of x_opt
x_old = x_opt;
% Output switching states
Sa = states(x_opt,1);
Sb = states(x_opt,2);
Sc = states(x_opt,3);
Alan Weiss on 21 Jan 2022
• Mark up your code so that it looks like code. That helps us distinguish code from comments.
• Report ALL of the red error message that MATLAB returns
• Give us working code so we can reproduce your issue. This means give us the inputs you used for your function that cause it to throw an error
Alan Weiss
MATLAB mathematical toolbox documentation

_ on 21 Jan 2022
Try replacing this line:
g(i) = abs(real(v_ref - vc_k1)) + abs(imag(v_ref - vc_k1));
with this line:
g(:,i) = abs(real(v_ref(:) - vc_k1(:))) + abs(imag(v_ref(:) - vc_k1(:)));
The reason is that g(i) is a single element of g, but v_ref has (at least) 2 elements (don't know how many because we don't know what you send to the function), so the right-hand side is going to be non-scalar. From the initialization of g (g = zeros(2,8);) we can see the size of g is 2-by-8 so it's likely that each iteration of the loop is meant to set a column of g, i.e., g(:,i), rather than a single element g(i).

Cheng Syuan Ye on 9 Feb 2022
Hello, have you solved the problem, I am also researching recently, what is the final solution?
_ on 9 Feb 2022
The answer to this particular question is: