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;
0 件のコメント
採用された回答
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
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?
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Simulink Functions についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!