Any problem in using the Matlab coder?
조회 수: 2 (최근 30일)
이전 댓글 표시
Dear administrator,
I am testing the Matlab coder by the sample matlab code:
function mytest=test
mytest=zeros(10,1);
mytest=1;
The generated code is as follows:
/*
* test.c
*
* Code generation for function 'test'
*
* C source code generated on: Fri May 31 10:26:55 2013
*
*/
/* Include files */
#include "rt_nonfinite.h"
#include "findpeakcore.h"
#include "fpeak.h"
#include "test.h"
/* Function Definitions */
void test(real_T mytest_data[1], int32_T mytest_size[1])
{
mytest_size[0] = 1;
mytest_data[0] = 1.0;
}
/* End of code generation (test.c) */
Appearently the code is not correct. However, after I changed the matlab code as follows:
function mytest=test
mytest=zeros(10,1);
mytest(1:10)=1;
The generated C code is correct:
/*
* test.c
*
* Code generation for function 'test'
*
* C source code generated on: Fri May 31 10:45:26 2013
*
*/
/* Include files */
#include "rt_nonfinite.h"
#include "findpeakcore.h"
#include "fpeak.h"
#include "test.h"
/* Function Definitions */
void test(real_T mytest[10])
{
int32_T i;
for (i = 0; i < 10; i++) {
mytest[i] = 1.0;
}
}
/* End of code generation (test.c) */
Is there any problem in using the Matlab coder?
Thanks,
Laoya Tang
댓글 수: 0
답변 (3개)
Walter Roberson
2013년 5월 31일
The code generated for the original function looks correct to me. Your code statement
mytest = 1;
replaces all of "mytest" with the scalar 1.0, and the generated code constructs a scalar with value 1.0
The code for the second function replaces all elements of the vector "mytest" to make each of them 1.0. And that is reflected in the code, which generates the equivalent of ones(1,10)
Note that both of these are different than what you would get if your assignment had been
mytest(1) = 1.0;
When you use MATLAB Coder, once you have initialized a variable (giving it a type and a size) then you (I gather) can usually adjust its length as long as the new length does not exceed the first length. You initialize to the maximum length you might lose, and you chomp to the actual size used. Which is what the code in your first example does.
댓글 수: 0
laoya
2013년 5월 31일
댓글 수: 2
Walter Roberson
2013년 5월 31일
The generated code for your first version makes the result be just the 1 x 1 scalar with content 1.0. It does that because that is what your code requests.
mytest = 1;
requests that all of mytest be thrown out and the 1 x 1 scalar 1.0 stored.
Your second version sets all of the elements to 1.0 . You could, though, rewrite it as
mytest(1:end) = 1;
or
mytest(:) = 1;
or you could skip both that line and the zeros() line and use
mytest = ones(1,10);
laoya
2013년 5월 31일
편집: Walter Roberson
2013년 5월 31일
댓글 수: 6
Walter Roberson
2013년 6월 1일
with respect to MATLAB Coder (MATLAB interactive works a bit differently)
mytest = zeros(1,10);
means to establish an entry named "mytest" in the variable table, and to mark it as being of type double, and then to mark its current length as 10 and assign 0.0 to those 10 locations. I believe it does not keep a record of the maximum length (10), but I am not positive. It will use the initial size for the C declaration, but it might not track that size afterwards.
Then after that,
mytest = 1;
means to take that existing entry, check that "1" is convertible to the existing "double" of that entry (which of course it is as it is already double), and then to mark the current length as being 1 and set that 1 element to 1.0. At that point, as far as the Coder is concerned, the length is only 1, there is only 1 element, not 10.
If you want to set just the first element to 1, the code would be
test(1) = 1;
and that would only change the internal marking of the current size if 1 was greater than the current size.
Now,
mytest(1:10) = 1;
means to take that existing entry, check that "1" is convertible to the existing "double" of that entry (which of course it is as it is already double), and then to mark the current length as being 10 (unless it was already larger) and to set 10 elements to 1.0. I think that if the original size was less than 10, then the generated code would be allowed to write into whatever was in memory after the elements that were originally declared. Which would pretty likely create problems... eventually.
The code has two different purposes. The first bit of code changes the size to be length 1 and changes that; the second affects 10 elements. The generated code for them should be different.
If you want to code to change all the elements of test, no matter how many there are, then
test(:) = 1;
would be appropriate.
Please keep in mind that in MATLAB itself, when you assign a value to an entire variable (no subscript on the left side) then the new value replaces the existing variable as if you had clear'd the variable and then assigned the new value to it.
A = [1 2 3];
A = 'hello'
in MATLAB itself means that A is to be entirely replaced by the character vector 'h' 'e' 'l' 'l' 'o', and not that the elements of A should be overwritten with 'hello'
A = [1 2 3];
A(:) = 'hel';
would leave A as [104.0 101.0 108.0] rather than as 'hel' because discarding and replacing a variable means a different thing than writing over top of part of that variable.
참고 항목
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!