Errors in converting to C code

조회 수: 2 (최근 30일)
Maurilio Matracia
Maurilio Matracia 2022년 9월 18일
답변: Yash 2023년 8월 30일
Hello everyone,
I have the following code that I want to speed up by converting to C (I never did that before):
function [MD_a,mismatch_SminusA] = metaDistr_fun
tic
zero = 1e-6 ; Pi = 3.14159 ;
alpha = 3.5 ;
m = 1 ;
iterations = 3e1 ;
instants = 9e0 ;
sigma2 = 1e-11 ;
lambda0 = 1e-6 ;
Rd = 0.5e3 ;
Ra = 840 ;
Rb = 3286 ;
infty = 2e4 ;
xi = 20 ;
Chi = 0 ;
tau = 0.2 ;
X = linspace(0,1, 1) ; nX = length(X) ;
pTag = zeros(1,2) ; coord = {[0 0];[0 0]} ; ED = {0;0} ; EDmin = ED ; Hc = ED ; pr =0 ;
Ru=Rd
MD_s = zeros(1,nX) ; reliab = zeros(1,iterations) ; SINR = zeros(iterations,instants) ;
for i = 1:iterations
nD = poissrnd (Chi * lambda0 * pi * (Rd^2-0^2)) ;
thetaD = rand(nD,1) * 2*pi ;
rD = sqrt(rand(nD,1)*(Rd^2-0^2) + 0^2) ;
coord{1} = [ rD.*cos(thetaD) , rD.*sin(thetaD) ] ;
nTa = poissrnd(lambda0 * pi * (Ra^2-Rd^2));
nTb = poissrnd(lambda0 * pi * (infty^2-Rb^2)) ;
thetaT = rand(nTa+nTb,1) * 2*pi ;
rT = [sqrt(rand(nTa,1)*(Ra^2-Rd^2) + Rd^2); sqrt(rand(nTb,1)*(infty^2-Rb^2) + Rb^2)] ;
coord{2} = [ rT.*cos(thetaT) , rT.*sin(thetaT) ] ;
for B = 1:2
ED{B} = sqrt( (Ru-coord{B}(:, 1)).^2 + coord{B}(:, 2).^2 ) ;
if isempty(ED{B})
ED{B} = infty ; EDmin{B} = infty ;
else
EDmin{B} = min(ED{B}) ;
end
pTag(B) = xi * EDmin{B}^-alpha;
Hc{B} = gamrnd( m,1/m, length(ED{B}),instants ) ;
end
tag = find( pTag == max(pTag) ) ;
for t = 1:instants
pr = Hc{tag}( find(ED{tag}==EDmin{tag}),t ) *xi*EDmin{tag}^-alpha ;
PtotD = xi * sum(Hc{1}(:,t).*ED{1}.^-alpha) ;
Ptot = PtotD + xi * sum(Hc{2}(:,t).*ED{2}.^-alpha) ;
SINR(i,t) = pr/(Ptot-pr+sigma2) ;
end
reliab(i) = mean(SINR(i,:)>tau) ;
end
for x = 1 : nX
MD_s(x) = mean(reliab >= X(x)) ;
end
end
However, I am getting the following errors (screenshot attached), could anyone suggest me how to fix them?
Thanks in advance!

답변 (1개)

Yash
Yash 2023년 8월 30일
Hi Maurilio,
I was able to reproduce the error using the code you provided. After analysing your code, I noticed that the cell array 'ED' changes its shape in each iteration (line 32).
You can confirm this by removing the semicolon at the end of line 32.
It's important to note that not all MATLAB codes can be converted into C code using the MATLAB Coder. Since C does not support variable-size arrays, the variable size of 'ED' cannot be converted from MATLAB to C.
One possible workaround is to use padding. You can add extra zeros at the end of the arrays to fix their size. Preallocate the size for the arrays by creating an array of zeros or ones and avoid changing their size within the loop.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by