How to export to workspace a 4D array?
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
0 개 추천

Basically the first function is generating values between a certain range. This values are indexes in order to have access to certain locations of the 4D array.
When writting mode is active, I save the value of 0.365 to the current location. At the end I would like to export the 4D array to workspace with all the stored values.
The 4D array has the following dimensions: [50 311 91 61] = 86318050 single values
However the array seems to be not able to be exported due to the size. I thought that changing it into single values will help but it seems to be too big.
Any ideas on how to fix this?
채택된 답변
Ameer Hamza
2020년 5월 17일
Instead of using "To workspace" block, try using assignin(): https://www.mathworks.com/help/releases/R2020a/matlab/ref/assignin.html to directly save the values in the base workspace. For example, write the following line in your function
assignin('base', 'base_variable_name', array_filled)
댓글 수: 12
function [[out,array_filled] ] = fcn(new, input, status, initial_array, export)
%Multidimensional array dimensions
xmin = 0; xmax = 200; xincr = 5;
ymin = -25; ymax = 25; yincr = 5;
zmin = 0; zmax = 180; zincr = 5;
hmin = -10; hmax = 10; hincr = 5;
xvec = xmin : xincr : xmax;
yvec = ymin : yincr : ymax;
zvec = zmin : zincr : zmax;
hvec = hmin : hincr : hmax;
x2xidx = @(xval) round((xval - xmin)/xincr) + 1;
y2yidx = @(yval) round((yval - ymin)/yincr) + 1;
z2zidx = @(zval) round((zval - zmin)/zincr) + 1;
h2hidx = @(hval) round((hval - hmin)/hincr) + 1;
persistent storage
persistent a_new
if isempty(storage)
storage = initial_array;
a_new = 0;
end
%(read only)
if status == 1
a_new = storage(index1,index2,index3,index4);
end
%write only)
if status == 0
storage(index1,index2,index3,index4);
a_new = 50;
end
if export == 1
multi_array = storage;
else
multi_array = single(zeros(nx,ny,nz,nh));
end
out = a_new;
array_filled = multi_array;
I should change it like this?
function [[out,array_filled] ] = fcn(new, input, status, initial_array, export)
assignin('base', 'multi_array', array_filled)
%Multidimensional array dimensions
xmin = 0; xmax = 200; xincr = 5;
ymin = -25; ymax = 25; yincr = 5;
zmin = 0; zmax = 180; zincr = 5;
hmin = -10; hmax = 10; hincr = 5;
xvec = xmin : xincr : xmax;
yvec = ymin : yincr : ymax;
zvec = zmin : zincr : zmax;
hvec = hmin : hincr : hmax;
x2xidx = @(xval) round((xval - xmin)/xincr) + 1;
y2yidx = @(yval) round((yval - ymin)/yincr) + 1;
z2zidx = @(zval) round((zval - zmin)/zincr) + 1;
h2hidx = @(hval) round((hval - hmin)/hincr) + 1;
persistent storage
persistent a_new
if isempty(storage)
storage = initial_array;
a_new = 0;
end
%(read only)
if status == 1
a_new = storage(index1,index2,index3,index4);
end
%write only)
if status == 0
storage(index1,index2,index3,index4);
a_new = 50;
end
if export == 1
multi_array = storage;
else
multi_array = single(zeros(nx,ny,nz,nh));
end
out = a_new;
No, add this line at the end of your function definition like this
function [[out,array_filled] ] = fcn(new, input, status, initial_array, export)
%Multidimensional array dimensions
xmin = 0; xmax = 200; xincr = 5;
ymin = -25; ymax = 25; yincr = 5;
zmin = 0; zmax = 180; zincr = 5;
hmin = -10; hmax = 10; hincr = 5;
xvec = xmin : xincr : xmax;
yvec = ymin : yincr : ymax;
zvec = zmin : zincr : zmax;
hvec = hmin : hincr : hmax;
x2xidx = @(xval) round((xval - xmin)/xincr) + 1;
y2yidx = @(yval) round((yval - ymin)/yincr) + 1;
z2zidx = @(zval) round((zval - zmin)/zincr) + 1;
h2hidx = @(hval) round((hval - hmin)/hincr) + 1;
persistent storage
persistent a_new
if isempty(storage)
storage = initial_array;
a_new = 0;
end
%(read only)
if status == 1
a_new = storage(index1,index2,index3,index4);
end
%write only)
if status == 0
storage(index1,index2,index3,index4);
a_new = 50;
end
if export == 1
multi_array = storage;
else
multi_array = single(zeros(nx,ny,nz,nh));
end
out = a_new;
assignin('base', 'multi_array', array_filled)
Mariana
2020년 5월 17일
But I need to remove the "to workspace" block?
Ameer Hamza
2020년 5월 17일
Yes, you should remove it. assignin will already save values in the base workspace.
Function 'assignin' not supported for code generation.
Function 'MATLAB Function' (#132.4706.4751), line 154, column 1:
"assignin('base', 'array_filled', multi_array)"
Launch diagnostic report.
Oh! I forgot it does not support code generation. Change the function definition to this
function [[out,array_filled] ] = fcn(new, input, status, initial_array, export)
coder.extrinsic('assignin') % <===== added this line
%Multidimensional array dimensions
xmin = 0; xmax = 200; xincr = 5;
ymin = -25; ymax = 25; yincr = 5;
zmin = 0; zmax = 180; zincr = 5;
hmin = -10; hmax = 10; hincr = 5;
xvec = xmin : xincr : xmax;
yvec = ymin : yincr : ymax;
zvec = zmin : zincr : zmax;
hvec = hmin : hincr : hmax;
x2xidx = @(xval) round((xval - xmin)/xincr) + 1;
y2yidx = @(yval) round((yval - ymin)/yincr) + 1;
z2zidx = @(zval) round((zval - zmin)/zincr) + 1;
h2hidx = @(hval) round((hval - hmin)/hincr) + 1;
persistent storage
persistent a_new
if isempty(storage)
storage = initial_array;
a_new = 0;
end
%(read only)
if status == 1
a_new = storage(index1,index2,index3,index4);
end
%write only)
if status == 0
storage(index1,index2,index3,index4);
a_new = 50;
end
if export == 1
multi_array = storage;
else
multi_array = single(zeros(nx,ny,nz,nh));
end
out = a_new;
assignin('base', 'multi_array', array_filled)
Mariana
2020년 5월 17일
You were right. It works now.
Thanks a lot!
Mariana
2020년 5월 17일
Is it possible to load a variable in simulink workspace of 400MB?
Ameer Hamza
2020년 5월 17일
I am not sure. Maybe you can try the constant block to load the value in Simulink workspace. Otherwise, you can again use evalin(), opposite of assignin, to directly read the value from the base workspace. Another approach (preferable) is mentioned in Rubem's answer here: https://www.mathworks.com/matlabcentral/answers/110060-simulink-matlab-function-block#answer_385817
Mariana
2020년 6월 3일
I have added the variable of 400MB into the simulink workspace, but I am not able to compile the model. I have an error message that there is no heap space, any suugestion on how to solve this issue?
I haven't worked with Simulink compiler, so I don't know about this issue. Maybe the following will be helpful
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Signal Operations에 대해 자세히 알아보기
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
