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, el R{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 declarar R 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