Matlab R2015a coder error:Dimension 1 is fixed on the left-hand side but varies on the right ([1024 x 1] ~= [:? x 1]).

27 ビュー (過去 30 日間)
I use Matlab R2015a coder to compile a .m function to C code.But get three errors.How can I solve these errors?Thank you for any advice. here is the errors:
  • line 117:Dimension 1 is fixed on the left-hand side but varies on the right ([1024 x 1] ~= [:? x 1]).
  • line 118:Dimension 2 is fixed on the left-hand side but varies on the right ([60 x 1024] ~= [60 x :?]).
  • line 119:Dimension 1 is fixed on the left-hand side but varies on the right ([1024 x 1] ~= [:? x 1]).
and line117-119 is:
gamma = gamma(index);
Phi = Phi(:,index); % corresponding columns in Phi
keep_list = keep_list(index);
below is my code:
function [X, gamma_ind, gamma_est, count] = MFOCUSS_edit7(Phi, Y, lambda)
% MFOCUSS algorithm for the MMV model
%
% ============================== INPUTS ==============================
% Phi : N X M dictionary matrix
%
% Y : N X L measurement matrix, i.e. Y = Phi * X + V.
%
% lambda : Regularization parameter. Generally it is close to the noise variance.
% In the noiseless cases, simply setting lambda = 1e-10 leads to good performance.
% In noisy cases, need the modified L-curve method to find optimal lambda.
% See Ref [1] for details.
%
% 'p' : p-norm. p lies in [0,1]. Default value: p = 0.8
%
% 'PRUNE_GAMMA' : Threshold for prunning small gamma_i.
% In noisy cases, you can set PRUNE_GAMMA = 1e-3 or 1e-4.
% In strongly noisy cases (SNR<=5 dB), suggest to set PRUNE_GAMMA = 0.01;
% Default value: MIN_GAMMA = 1e-4.
%
% 'MAX_ITERS' : Maximum number of iterations.
% Default value: MAX_ITERS = 800
%
% 'EPSILON' : Threshold to stop the whole algorithm.
% Default value: EPSILON = 1e-8
%
% 'PRINT' : Display flag. If PRINT = 1: show output; If PRINT = 0: supress output
% Default value: PRINT = 0
%
% ============================== OUTPUTS ==============================
% X : Estimated solution matrix(size: M X L)
% gamma_ind : Indexes of nonzero gamma_i
% gamma_est : Final values of all the gamma_i (including zeros). An M X 1 vector
% count : number of iterations used
%
% ============== Examples of Commands ===============
% [Example 1]
% lambda = 1e-3;
% [X,gamma_ind,gamma_est,count] ...
% = MFOCUSS(Phi,Y,lambda,'p',0.8,'prune_gamma',1e-4,'max_iters',500,'epsilon',1e-8,'print',0);
%
% [Example 2]
% lambda = 1e-5;
% [X,gamma_ind,gamma_est,count] = MFOCUSS(Phi,Y, lambda);
%
% ============================== Reference =============================
% [1] Cotter, S.F.; Rao, B.D.; Kjersti Engan; Kreutz-Delgado, K.;
% Sparse solutions to linear inverse problems with multiple measurement vectors
%
% ============================== Author ==============================
% Zhilin Zhang (z4zhang@ucsd.edu)
% Mainbody was written by David Wipf
%
% ============================== Version ==============================
% 1.0 (05/12/2011)
%
% ============================== See Also ==============================
% TSBL TMSBL ARSBL tMFOCUSS
%
% Dimension of the Problem
[N, M] = size(Phi);
[N, L] = size(Y);
% Default Control Parameters
PRUNE_GAMMA = 1e-4; % threshold for prunning small gamma_i
p = 0.8; % p-norm
EPSILON = 1e-8; % threshold for stopping iteration.
MAX_ITERS = 800; % maximum iterations
PRINT = 0; % not show progress information
% get input argument values
% if(mod(length(varargin),2)==1)
% error('Optional parameters should always go by pairs\n');
% else
% for i=1:2:(length(varargin)-1)
% switch lower(varargin{i})
% case 'p'
% p = varargin{i+1};
% case 'prune_gamma'
% PRUNE_GAMMA = varargin{i+1};
% case 'epsilon'
% EPSILON = varargin{i+1};
% case 'print'
% PRINT = varargin{i+1};
% case 'max_iters'
% MAX_ITERS = varargin{i+1};
% otherwise
% error(['Unrecognized parameter: ''' varargin{i} '''']);
% end
% end
% end
%
% if (PRINT) fprintf('\nRunning M-FOCUSS for the MMV Problem...\n'); end
% Initializations
gamma = ones(M,1); % initialization of gamma_i
keep_list = [1:M]'; % record the index of nonzero gamma_i
m = length(keep_list); % number of nonzero gamma_i
mu = complex(zeros(M,L)); % initialization of the solution matrix
count = 0; % record iterations
% Learning loop
while (1)
% =========== Prune weights as their hyperparameters go to zero ===========
if (min(gamma) < PRUNE_GAMMA )
index = find(gamma > PRUNE_GAMMA);
% tmp = [];
% for i =1:1:length(index)
% tmp(i) = gamma(index(i))
% end
% gamma = tmp'
gamma = gamma(index);
Phi = Phi(:,index); % corresponding columns in Phi
keep_list = keep_list(index);
m = length(gamma);
if (m == 0) break; end;
end;
% ====== Compute new weights ======
G = repmat(sqrt(gamma)',N,1);
PhiG = Phi.*G;
[U,S,V] = svd(PhiG,'econ');
% [U,S,V] = svd_edit(PhiG);
[d1,~] = size(S);
if (d1 > 1) diag_S = diag(S);
else diag_S = S(1); end;
U_scaled = U(:,1:min(N,m)).*repmat((diag_S./(diag_S.^2 + sqrt(lambda) + 1e-16))',N,1);
Xi = G'.*(V*U_scaled');
mu_old = mu;
mu = Xi*Y;
% *** Update hyperparameters ***
gamma_old = gamma;
mu2_bar = sum(abs(mu).^2,2);
gamma = (mu2_bar/L).^(1-p/2);
% ========= Check stopping conditions, etc. =========
count = count + 1;
% if (PRINT) disp(['iters: ',num2str(count),' num coeffs: ',num2str(m), ...
% ' gamma change: ',num2str(max(abs(gamma - gamma_old)))]); end;
if (count >= MAX_ITERS) break; end;
[m_mu,n_mu] = size(mu);
[m_mu_old,n_mu_old]= size(mu_old);
% if (size(mu) == size(mu_old))
if ((m_mu == m_mu_old) && (n_mu == n_mu_old))
dmu = max(max(abs(mu_old - mu)));
if (dmu < EPSILON) break; end;
end;
end;
gamma_ind = sort(keep_list);
gamma_est = zeros(M,1);
gamma_est(keep_list,1) = gamma;
% expand the final solution
X = complex(zeros(M,L));
X(keep_list,:) = mu;
% if (PRINT) fprintf('\nM-FOCUSS finished !\n'); end
return;

採用された回答

Mike Hosea
Mike Hosea 2015 年 8 月 11 日
編集済み: Mike Hosea 2015 年 8 月 11 日
Use coder.varsize to create a variable-size copy of the Phi input. Rename the Phi input to something like PhiInput and just before the line "% Dimension of the Problem", add
coder.varsize('Phi');
Phi = PhiInput;
  9 件のコメント
Jeremy Rutman
Jeremy Rutman 2024 年 4 月 17 日
fieldAssign() just fills the structure fields with their associated values. Since the fields are of various types we can't just replace the RHS of the assignment with 0 or the like . As mentioned, the assignment works fine when not looped. Are there other workarounds for this type of situation?
Walter Roberson
Walter Roberson 2024 年 4 月 17 日
What is the code for fieldAssign() ?
Details matter in this case.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeSimulink Functions についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by