Convertir código Matlab en C++ con Coder Matlab - Problema celular
Estoy tratando de convertir una función a C++ en Matlab Coder. Hay una variable celular y mientras la construcción de mex da un error.
R=cell(1,n);
for i=1:wi
for j=1:hi
if(cin(i,j)>0)
k=cin(i,j);
for x=i-2*rx+1:i+2*rx-1
for y=j-2*ry+1:j+2*ry-1
if(x>=1 && y>=1 && x<=wi && y<=hi)
R{k}=[R{k}, (x-1)*wi+y];
end
end
end
end
end
end
Da error en R{k}=[R{k}, (x-1)*wi+y]; parte
Intente acceder a un elemento que no se definió antes del uso. '
¿Alguien puede ayudarme con esto?
Pregunta hecha hace 3 años, 5 meses, 0 días - Por codealchemy
3 Respuestas:
-
Para la generación de código, usted tiene que definir (es decir, asignar) todos los elementos de matriz de células antes de su uso. Aquí.
R{k}
se utiliza antes de ser asignado. Es decir, elR{k}
en el RHS de esa asignación lee ese elemento antes de que se le haya asignado.Si usted piensa que los elementos son matrices vacías,
[]
, entonces usted puede declararR
como:% Cells should be varsize to grow them later on coder.varsize('R{:}'); % Initialize all cells to empty R = repmat({[]}, 1, n); for i=1:wi for j=1:hi if(cin(i,j)>0) k=cin(i,j); for x=i-2*rx+1:i+2*rx-1 for y=j-2*ry+1:j+2*ry-1 if(x>=1 && y>=1 && x<=wi && y<=hi) R{k}=[R{k}, (x-1)*wi+y]; end end end end end end
Más detalles en el MATLAB Coder doc:
https://www.mathworks.com/help/simulink/ug/cell-array-restrictions-for-code-generation.html
Respondida el Dec 17, 2020 a las 15:12 - por htmlhelix
Votos positivos: 0 | Votos negativos: 0 -
El problema que estás experimentando en la conversión de tu código Matlab a C++ con Matlab Coder se debe a que intentas acceder a un elemento de la celda
R
antes de que haya sido definido.En Matlab, puedes crear celdas vacías utilizando la función
cell
y luego asignar valores a elementos individuales de la celda. Sin embargo, en C++, al traducir este código, necesitas inicializar cada celda antes de acceder a ella.Para solucionar este problema, puedes inicializar cada celda de
R
con una celda vacía antes de acceder a sus elementos. Aquí te muestro cómo podrías modificar tu código:matlab R = cell(1, n); for i = 1:wi for j = 1:hi if cin(i,j) > 0 k = cin(i,j); if isempty(R{k}) R{k} = {}; % Inicializa la celda si está vacía end for x = i-2rx+1 : i+2rx-1 for y = j-2ry+1 : j+2ry-1 if x >= 1 && y >= 1 && x <= wi && y <= hi R{k} = [R{k}, (x-1)*wi+y]; end end end end end end
Esta modificación asegurará que cada celda en
R
se inicialice correctamente antes de intentar acceder a sus elementos. Ahora, cuando intentes convertir este código a C++ utilizando Matlab Coder, ya no deberías obtener el error que mencionaste.Respondida el Dec 18, 2020 a las 15:13 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error que estás encontrando al convertir tu código de MATLAB a C++ usando MATLAB Coder se debe a que estás intentando acceder a un elemento de una matriz celular que aún no ha sido inicializado. En MATLAB, las matrices celulares se inicializan automáticamente con celdas vacías cuando se crean, pero en C++ debes hacerlo explícitamente.
Para resolver este problema, debes inicializar la matriz celular
R
con celdas vacías antes de intentar acceder a sus elementos. Puedes hacerlo agregando la siguiente línea al comienzo de tu código:cpp R.resize(k); // Inicializa la matriz celular R con k celdas vacías
Esto creará una matriz celular de
k
celdas vacías y resolverá el error que estás encontrando.Aquí tienes el código modificado:
cpp R.resize(k); // Inicializa la matriz celular R con k celdas vacías for (int i = 0; i < wi; i++) { for (int j = 0; j < hi; j++) { if (cin(i, j) > 0) { k = cin(i, j); for (int x = i - 2 rx + 1; x <= i + 2 rx - 1; x++) { for (int y = j - 2 ry + 1; y <= j + 2 ry - 1; y++) { if (x >= 1 && y >= 1 && x <= wi && y <= hi) { R[k].push_back((x - 1) * wi + y); } } } } } }
Respondida el Dec 18, 2020 a las 15:24 - por Gemini
Votos positivos: 0 | Votos negativos: 0