What does this error message mean - No class precondition specified for input 'x' of function 'square'.

1 visualización (últimos 30 días)
The function I was using is as follows:
function y = square(x)
%
% calculate the square of the given number 'x'
%
% Arguments:
%
% x (input) value to be squared
%
% y (output) the result of the square
%
y = x*x;
% end of square function
  3 comentarios
Valline
Valline el 25 de Oct. de 2011
I am trying to generate a mex function for the m-function given above, using matlab coder. When I type this line of code into the command window, this is when the error message appears:
'codegen square'
Walter Roberson
Walter Roberson el 26 de Oct. de 2011
Then I would say that my answer below is definitely the root cause of your problem. Unfortunately I do not know enough about Coder to tell you what you need to fix.
Well, other than the _first_ thing you need to fix is that you need to define for yourself (and document) what datatype you want this code to operate upon.

Iniciar sesión para comentar.

Respuestas (3)

Alexander Bottema
Alexander Bottema el 26 de Oct. de 2011
The error is given because you're trying to generate C code (which we later will automatically compile to a MEX function) for a function where you haven't specified any information about the function inputs.
There are several ways you can specify additional knowledge about the function inputs:
1. Use -args when compiling with 'codegen'. For example,
codegen square -args {zeros(3,3)}
Will generate a square_mex.<mexext> for which you can square any 3x3 matrix of class double.
codegen square -args {coder.typeof(0, [3 3], [1 1])}
Will generate a square_mex.<mexext> for which you can square any matrix with sizes up to 3x3 of class double.
codegen square -args {0}
Will generate a square_mex.<mexext> for which you can square a scalar only of class double.
codegen square -args {coder.typeof(complex(0), [1 100], [0 1])}
Will generate a square_mex.<mexext> for which you can square a matrix of complex doubles where the first dimension is fixed, and the second dimension is variable with an upper bound of 100 elements.
Check for more information by doing 'help codegen' We generate different code for all the above scenarios because we take advantage of all static type information so we can generate as efficient C code as possible.
2. Instead of using -args you can use assertions on the function inputs that will equal the same kind of information:
function y = square(x) %#codegen
assert(isa(x, 'double'));
assert(all(size(x) <= [10 10]));
y = x*x;
Here you can square any matrix up to 10x10 (real and of class double).
Prior to MATLAB Coder, i.e. Embedded MATLAB and the emlc/emlmex commands, we assumed scalar doubles if assertions/args were not given. However, this confused users when they try to call the generated MEX function with other input sizes.
I hope this helps.
Thanks, Alexander
  2 comentarios
YOGESH
YOGESH el 6 de Dic. de 2013
Editada: YOGESH el 6 de Dic. de 2013
I have installed the matlab coder toolbox on Linux 64 machine on compute node in silent mode.
When I try to generate the c code by using the codegen, I always get an error. The error is pasted here
>> codegen -c magicsquare -args {coder.typeof(0)}
??? Argument must be a constant. MAGIC does not support variable-size output.
Error in ==> magicsquare Line: 10 Column: 5 Code generation failed: To view the report, open('/users/home/****/****/****/test_coder/codegen/mex/magicsquare/html/index.html'). Error using codegen
m = magic(n) is the line: 10 in magicsquare.m
This happens for even the hello_word.m program.
Is there any other options I should add to solve it.
Thanks, Yogesh

Iniciar sesión para comentar.


Daniel Shub
Daniel Shub el 25 de Oct. de 2011
What do you get with
which square -all
square is a function in the signal processing toolbox. Do you have any other functions or variables named square.

Walter Roberson
Walter Roberson el 25 de Oct. de 2011
I do not know the solution, but I believe I recognize the problem.
Because your routine is so general, MATLAB is not able to determine what kind of data you will be feeding in to it. For example, will the data be double precision numbers? int32? A matrix that needs to be matrix-multiplied by itself? Or perhaps the input might even be a member of a class that defines its own mtimes() operator that does something pretty different than multiplication.
In order to get your routine to compile, you need to nail it down to one particular datatype.
Unfortunately I do not know at the moment how one does that.
  2 comentarios
Walter Roberson
Walter Roberson el 25 de Oct. de 2011
I do not have the compiler. The poster tagged with "mex", but I suspect they are talking about the MATLAB Compiler or possibly about Embedded MATLAB, as those would want to know what data-type they were dealing with.

Iniciar sesión para comentar.

Categorías

Más información sobre MATLAB Algorithm Acceleration en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by