{"group":{"id":1,"name":"Community","lockable":false,"created_at":"2012-01-18T18:02:15.000Z","updated_at":"2025-12-14T01:33:56.000Z","description":"Problems submitted by members of the MATLAB Central community.","is_default":true,"created_by":161519,"badge_id":null,"featured":false,"trending":false,"solution_count_in_trending_period":0,"trending_last_calculated":"2025-12-14T00:00:00.000Z","image_id":null,"published":true,"community_created":false,"status_id":2,"is_default_group_for_player":false,"deleted_by":null,"deleted_at":null,"restored_by":null,"restored_at":null,"description_opc":null,"description_html":null,"published_at":null},"problems":[{"id":950,"title":"Cody Matlab Version","description":"What is the current Cody Matlab Release? \r\n\r\n*Output:* string\r\n\r\n\r\n*Examples:*\r\n\r\n\r\n'(R2012a)' or 'R2012a'\r\n\r\n\r\nHint: We have moved forward\r\n\r\nPosted 9/16/12","description_html":"\u003cp\u003eWhat is the current Cody Matlab Release?\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e string\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e'(R2012a)' or 'R2012a'\u003c/p\u003e\u003cp\u003eHint: We have moved forward\u003c/p\u003e\u003cp\u003ePosted 9/16/12\u003c/p\u003e","function_template":"function str = Cody_version\r\n  str='(R2012a)';\r\nend","test_suite":"%%\r\n% 09/21/2012\r\nstr=Cody_version;\r\nlatest=ver;\r\nRelease=latest(1,1).Release;\r\nRelease2= regexprep(Release,'[()]','');\r\nPass= strcmp(str,Release) || strcmp(str,Release2);\r\nassert(isequal(Pass,1))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":175,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-09-16T23:58:44.000Z","updated_at":"2026-02-05T16:40:06.000Z","published_at":"2012-09-17T00:50:33.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWhat is the current Cody Matlab Release?\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e string\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e'(R2012a)' or 'R2012a'\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eHint: We have moved forward\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ePosted 9/16/12\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":43605,"title":"struct2values()","description":"Convert a struct object into a column vector. You can assume that the struct elements are scalars\r\n\r\nExample:\r\n\r\n  a = struct();\r\n  a.b = 1;\r\n  a.c = 4;\r\n  a.e = 55;\r\n\r\nRequested output:\r\n\r\n  [1;4;55]","description_html":"\u003cp\u003eConvert a struct object into a column vector. You can assume that the struct elements are scalars\u003c/p\u003e\u003cp\u003eExample:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ea = struct();\r\na.b = 1;\r\na.c = 4;\r\na.e = 55;\r\n\u003c/pre\u003e\u003cp\u003eRequested output:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e[1;4;55]\r\n\u003c/pre\u003e","function_template":"function vals = your_fcn_name(structobj)\r\n    vals = ??;\r\nend","test_suite":"%%\r\na = struct();\r\na.a = 1;a.b = 2;a.c = 3;\r\ny_correct = [1;2;3];\r\nassert(isequal(your_fcn_name(a),y_correct))\r\n\r\n%%\r\na = struct();\r\na.a = 1;a.b = 2;a.c = 3;a.d = 4;\r\ny_correct = [1;2;3;4];\r\nassert(isequal(your_fcn_name(a),y_correct))","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":29461,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":35,"test_suite_updated_at":"2016-12-05T18:24:07.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2016-10-24T14:52:23.000Z","updated_at":"2026-03-06T13:39:03.000Z","published_at":"2016-10-24T14:52:23.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eConvert a struct object into a column vector. You can assume that the struct elements are scalars\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[a = struct();\\na.b = 1;\\na.c = 4;\\na.e = 55;]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eRequested output:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[[1;4;55]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2037,"title":"Insert structure in a parameter-cell array.","description":"When creating Matlab GUI elements, you can mix value pairs with structures in the list of input arguments, e.g.\r\n\r\n|uicontrol('tag','click',struct('position',[0 0 100 20]),'style','push')|\r\n\r\nSuppose you are creating a function that pre-processes the gui-creation call, and you want to convert the mix of both into a single cell array. That is what this assignment is about. \r\n\r\nYou are creating a function that converts a cell array that may contain structures into a cell array, with the newly added cells in the place of the structures. ","description_html":"\u003cp\u003eWhen creating Matlab GUI elements, you can mix value pairs with structures in the list of input arguments, e.g.\u003c/p\u003e\u003cp\u003e\u003ctt\u003euicontrol('tag','click',struct('position',[0 0 100 20]),'style','push')\u003c/tt\u003e\u003c/p\u003e\u003cp\u003eSuppose you are creating a function that pre-processes the gui-creation call, and you want to convert the mix of both into a single cell array. That is what this assignment is about.\u003c/p\u003e\u003cp\u003eYou are creating a function that converts a cell array that may contain structures into a cell array, with the newly added cells in the place of the structures.\u003c/p\u003e","function_template":"function y = mix2cell(x)\r\n  y = x;\r\nend","test_suite":"%%\r\nx = {'string','blah',struct('position',[10 10 100 20]),'tag','me'};\r\ny = mix2cell(x);\r\ny_correct = {'string','blah','position',[10 10 100 20],'tag','me'};\r\nassert(isequal(y,y_correct))\r\n\r\n%%\r\nx = {'string','blahblah','tag','me'};\r\ny = mix2cell(x);\r\ny_correct = {'string','blahblah','tag','me'};\r\nassert(isequal(y,y_correct))\r\n\r\n%%\r\nx = {'string','blah',struct('value',rand(100),'backgroundcolor',[1 0 1]),'tag','me too',struct('foregroundcolor',[0 1 0.5])};\r\ny = mix2cell(x);\r\ny_correct = {'string','blah','value',x{3}.value,'backgroundcolor',[1 0 1],'tag','me too','foregroundcolor',[0 1 0.5]};\r\nassert(isequal(y,y_correct))\r\n\r\n\r\n%%\r\nx = {'string','blah',struct('string','blahblah'),'string','',struct('string','this one')};\r\ny = mix2cell(x);\r\ny_correct = {'string','blah','string','blahblah','string','','string','this one'};\r\nassert(isequal(y,y_correct))","published":true,"deleted":false,"likes_count":3,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":18,"test_suite_updated_at":"2013-12-06T15:23:35.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-12-06T15:12:34.000Z","updated_at":"2026-02-21T13:42:26.000Z","published_at":"2013-12-06T15:23:35.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWhen creating Matlab GUI elements, you can mix value pairs with structures in the list of input arguments, e.g.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003euicontrol('tag','click',struct('position',[0 0 100 20]),'style','push')\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSuppose you are creating a function that pre-processes the gui-creation call, and you want to convert the mix of both into a single cell array. That is what this assignment is about.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou are creating a function that converts a cell array that may contain structures into a cell array, with the newly added cells in the place of the structures.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":52552,"title":"Undocumented MATLAB tricks No. 1 - Save a function-returned struct","description":"Often we face the case when we want to save a function-returned struct to a mat file with each of its field as individual variables.\r\nFor example, the function returns a struct of 3 fields: a=1,b=2,c=3. Then you should save a file with 3 variables: a=1,b=2,c=3.\r\nThis problem is easy to just solve, but could be difficult to find the best solution of size 13! You may need some undocumented tricks.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.44px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: none solid rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 144px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 72px; transform-origin: 407px 72px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eOften we face the case when we want to save a function-returned struct to a mat file with each of its field as individual variables.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eFor example, the function returns a struct of 3 fields: a=1,b=2,c=3. Then you should save a file with 3 variables: a=1,b=2,c=3.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eThis problem is easy to just solve, but could be difficult to find the best solution of size 13! You may need some undocumented tricks.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function ans=SaveStruct(FilePath,Function)\r\n%No need to give any return values. It's just cody's stupid validation rule that does not allow a function template without a return value.\r\nend","test_suite":"%%\r\n% Generate random variable names and values\r\nValues=unique(randi(100,1,100));\r\nFields=\"F\"+string(Values);\r\nInput=[num2cell(Fields);num2cell(Values)];\r\nStructToSave=struct(Input{:});\r\n% Save the struct\r\nSaveStruct(\"Struct.mat\",@()StructToSave);\r\n% Check if the file matches the struct\r\nassert(isequal(StructToSave,load(\"Struct.mat\")));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":362068,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":"2021-08-16T09:54:05.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2021-08-16T09:34:52.000Z","updated_at":"2021-08-16T09:55:59.000Z","published_at":"2021-08-16T09:54:05.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOften we face the case when we want to save a function-returned struct to a mat file with each of its field as individual variables.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFor example, the function returns a struct of 3 fields: a=1,b=2,c=3. Then you should save a file with 3 variables: a=1,b=2,c=3.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is easy to just solve, but could be difficult to find the best solution of size 13! You may need some undocumented tricks.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":1329,"title":"dir with recursive subdirectory search","description":"Write a function that performs a recursive file search.  The input and output\r\nformat can be identical to the dir function. The result should be a struct with the filenames in the field \"name\".\r\n\r\n\r\n_The first solution is from Kelly Kearney (2006)._\r\n","description_html":"\u003cp\u003eWrite a function that performs a recursive file search.  The input and output\r\nformat can be identical to the dir function. The result should be a struct with the filenames in the field \"name\".\u003c/p\u003e\u003cp\u003e\u003ci\u003eThe first solution is from Kelly Kearney (2006).\u003c/i\u003e\u003c/p\u003e","function_template":"function y = subdir(x)\r\n  y = dir(x);\r\nend","test_suite":"%% count files subdirectories\r\nfiles = subdir(fullfile(matlabroot,'java'));\r\nassert(numel(files)\u003e=595 \u0026 isfield(files,'name'))\r\n\r\n%% count text files\r\nfiles = subdir(fullfile(matlabroot,'*.txt'));\r\n[~,~,ext]=cellfun(@fileparts,{files.name},'UniformOutput',false);\r\nassert(numel(files)\u003e=209 \u0026 isfield(files,'name') \u0026 all(strcmp(ext,'.txt')))\r\n\r\n%%\r\nfiles = subdir(fullfile(matlabroot,'toolbox','*.m'));\r\n[~,~,ext] = cellfun(@fileparts,{files.name},'UniformOutput',false);\r\nassert(numel(files)\u003e=15060 \u0026 isfield(files,'name') \u0026 all(strcmp(ext,'.m')))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":3105,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-03-09T18:24:49.000Z","updated_at":"2013-03-09T19:15:20.000Z","published_at":"2013-03-09T19:08:55.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWrite a function that performs a recursive file search. The input and output format can be identical to the dir function. The result should be a struct with the filenames in the field \\\"name\\\".\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eThe first solution is from Kelly Kearney (2006).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":54650,"title":"Merge structs on fields","description":"Merge a bunch of structs into one, containing the field names and corresponding values of all input structs. For duplicate field names, only the last value is kept.\r\nIf you can reach a size less than 63, you're doing better than my reference solution!","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.44px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: none solid rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 72px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 36px; transform-origin: 407px 36px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eMerge a bunch of structs into one, containing the field names and corresponding values of all input structs. For duplicate field names, only the last value is kept.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eIf you can reach a size less than 63, you're doing better than my reference solution!\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function Merged = MergeStructs(varargin)","test_suite":"%%\r\nS1=struct;\r\nassert(isequaln(orderfields(MergeStructs(S1)),S1));\r\n%%\r\nS1=struct(A=table,C=[]);\r\nS2=struct(A=1,B='k');\r\nassert(isequaln(orderfields(MergeStructs(S1,S2)),struct(A=1,B='k',C=[])));\r\n%%\r\nS1=struct(A=\"A\",B='B',C=[]);\r\nS2=struct;\r\nS3=struct(CC=NaN,B=\"\",Z2=missing);\r\nassert(isequaln(orderfields(MergeStructs(S2,S1,S3)),struct(A=\"A\",B=\"\",C=[],CC=NaN,Z2=missing)));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":362068,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2022-05-14T07:24:16.000Z","updated_at":"2022-05-14T07:24:16.000Z","published_at":"2022-05-14T07:24:16.000Z","restored_at":null,"restored_by":null,"spam":null,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMerge a bunch of structs into one, containing the field names and corresponding values of all input structs. For duplicate field names, only the last value is kept.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIf you can reach a size less than 63, you're doing better than my reference solution!\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":42859,"title":"Convert nested struct-array to numeric array","description":"Sometimes data happens to be nicely structured in a struct-array, distributed over various levels of the struct, according to the hierarchy in the logic of the data acquisition.\r\nFor fitting the data, the relevant elements of the struct-array need to be converted to a simple, multi-dimensional numeric array.\r\n\r\nThat will be your assignment.\r\n\r\nCreate a function struct2mat that takes a struct-array as an input, and returns an array, where dimensions of the output data correspond to the struc-array levels in incremental order. The first output level enters dimension 1 of the output, the 2nd dimension 2, etc.\r\n\r\n  datastruct(1).level2(1).level3(1).data = 1:4;\r\n  ...\r\n  datastruct(4).level2(3).level3(2).data = 4321:4324;\r\n\r\n  dataarray = struct2mat(datastruct)\r\n\r\nshould result in \r\n\r\n  dataarray(1,1,1,1) = 1;\r\n  ...\r\n  dataarray(1,1,1,4) = 4;\r\n  ...\r\n  dataarray(4,3,2,3) = 4323;\r\n\r\n\u003c\u003chttp://i64.tinypic.com/zkrbm1.jpg\u003e\u003e\r\n\r\nI encourage you to write a function that does not use loops to access the different struct-array levels.","description_html":"\u003cp\u003eSometimes data happens to be nicely structured in a struct-array, distributed over various levels of the struct, according to the hierarchy in the logic of the data acquisition.\r\nFor fitting the data, the relevant elements of the struct-array need to be converted to a simple, multi-dimensional numeric array.\u003c/p\u003e\u003cp\u003eThat will be your assignment.\u003c/p\u003e\u003cp\u003eCreate a function struct2mat that takes a struct-array as an input, and returns an array, where dimensions of the output data correspond to the struc-array levels in incremental order. The first output level enters dimension 1 of the output, the 2nd dimension 2, etc.\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edatastruct(1).level2(1).level3(1).data = 1:4;\r\n...\r\ndatastruct(4).level2(3).level3(2).data = 4321:4324;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edataarray = struct2mat(datastruct)\r\n\u003c/pre\u003e\u003cp\u003eshould result in\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edataarray(1,1,1,1) = 1;\r\n...\r\ndataarray(1,1,1,4) = 4;\r\n...\r\ndataarray(4,3,2,3) = 4323;\r\n\u003c/pre\u003e\u003cimg src = \"http://i64.tinypic.com/zkrbm1.jpg\"\u003e\u003cp\u003eI encourage you to write a function that does not use loops to access the different struct-array levels.\u003c/p\u003e","function_template":"function mat = struct2mat(s)\r\n  c = struct2cell(s);\r\n  mat = [c{:}];\r\nend","test_suite":"%%\r\ndata_ref_temp = rand(5,4,3,2);\r\ndata.siz = size(data_ref_temp);\r\nglobal data\r\n\r\nfor i1 = 1:data.siz(1)\r\n    data.altitude.location(i1) = rand;\r\n    for i2 = 1:data.siz(2)\r\n        data.floor.location(i1).room(i2) = rand;\r\n        for i3 = 1:data.siz(3)\r\n            data.scale.location(i1).room(i2).device(i3) = rand;\r\n            for i4 = 1:data.siz(4)\r\n                data.temperature.location(i1).room(i2).device(i3).sample(i4) = data_ref_temp(i1,i2,i3,i4);\r\n                data.timestamp.location(i1).room(i2).device(i3).sample(i4) = i4;\r\n            end\r\n        end\r\n    end\r\nend\r\n\r\nassert(isequal(struct2mat(data.temperature),data_ref_temp))\r\n\r\n%%\r\nglobal data\r\ndata_ref_time = repmat(shiftdim(1:data.siz(4),-2),data.siz(1:3));\r\nassert(isequal(struct2mat(data.timestamp),data_ref_time))\r\n\r\n%%\r\nglobal data\r\nassert(isequal(struct2mat(data.altitude),data.altitude.location.'))\r\n\r\n%%\r\nglobal data\r\nassert(isequal(struct2mat(data.floor),cat(1,data.floor.location.room)))\r\n\r\n%%\r\nglobal data\r\ndata.scale.location;[ans.room];[ans.device];\r\nassert(isequal(struct2mat(data.scale),permute(reshape(ans,3,4,5),[3 2 1])))\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-05-23T07:59:17.000Z","updated_at":"2016-05-23T09:37:39.000Z","published_at":"2016-05-23T09:37:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSometimes data happens to be nicely structured in a struct-array, distributed over various levels of the struct, according to the hierarchy in the logic of the data acquisition. For fitting the data, the relevant elements of the struct-array need to be converted to a simple, multi-dimensional numeric array.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThat will be your assignment.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCreate a function struct2mat that takes a struct-array as an input, and returns an array, where dimensions of the output data correspond to the struc-array levels in incremental order. The first output level enters dimension 1 of the output, the 2nd dimension 2, etc.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[datastruct(1).level2(1).level3(1).data = 1:4;\\n...\\ndatastruct(4).level2(3).level3(2).data = 4321:4324;\\n\\ndataarray = struct2mat(datastruct)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eshould result in\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[dataarray(1,1,1,1) = 1;\\n...\\ndataarray(1,1,1,4) = 4;\\n...\\ndataarray(4,3,2,3) = 4323;]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eI encourage you to write a function that does not use loops to access the different struct-array levels.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"},{"id":2122,"title":"Simple Robotics 2 - End effector attitude","description":"Given a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\r\n\r\nWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\r\n\r\nYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\r\n\r\nTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\r\n\r\nTip2: alfa1 in the picture is negative.\r\n\r\nTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\r\n\r\nAs a visual reference, check the picture below.\r\n\r\n\u003c\u003chttp://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\u003e\u003e","description_html":"\u003cp\u003eGiven a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\u003c/p\u003e\u003cp\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\u003c/p\u003e\u003cp\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\u003c/p\u003e\u003cp\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\u003c/p\u003e\u003cp\u003eTip2: alfa1 in the picture is negative.\u003c/p\u003e\u003cp\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\u003c/p\u003e\u003cp\u003eAs a visual reference, check the picture below.\u003c/p\u003e\u003cimg src = \"http://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\"\u003e","function_template":"function newrobot = forwardkinematics(oldrobot)\r\n%   * robot.links(L1,L2,L3)\r\n% * robot.jointangles(alfa1,alfa2,alfa3)\r\n% * robot.attitude(x,y,tht)\r\nend","test_suite":"%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[0 0 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0 sum(robot.links) pi/2];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 0  0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[-0.5*sqrt(2)*sum(robot.links) 0.5*sqrt(2)*sum(robot.links) 3*pi/4];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 pi 3*pi/4];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.5*sqrt(2)*(robot.links(1)-robot.links(2)) 0.5*sqrt(2)*(robot.links(1)-robot.links(2))+robot.links(3) pi/2]\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-pi/4 pi/4 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0.5*sqrt(2)*robot.links(1) 0.5*sqrt(2)*robot.links(1)+sum(robot.links(2:3)) pi/2];\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-2.1513    2.9568    2.8725];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.246878929631356  -0.220349832044192   5.248796326794897]\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.0919    1.8867   -2.2501];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.260952279814086   0.667368060676958   1.115496326794896];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.4916    2.6121    1.8360];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.070611406176580  -0.000086942065283   5.527296326794897];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":20079,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-01-16T04:52:06.000Z","updated_at":"2014-01-25T01:02:46.000Z","published_at":"2014-01-24T01:47:31.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven a structure as input to your function with the following fields: * robot.links(L1,L2,L3) * robot.jointangles(alfa1,alfa2,alfa3) * robot.attitude(x,y,tht) Return the same struct with the correct end effector position and orientation in \\\"robot.attitude\\\". In a stretched out posture, the end effector angle is 0. In other words calculate the end effector x,y and alfa.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTip2: alfa1 in the picture is negative.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eAs a visual reference, check the picture below.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"}],"problem_search":{"errors":[],"problems":[{"id":950,"title":"Cody Matlab Version","description":"What is the current Cody Matlab Release? \r\n\r\n*Output:* string\r\n\r\n\r\n*Examples:*\r\n\r\n\r\n'(R2012a)' or 'R2012a'\r\n\r\n\r\nHint: We have moved forward\r\n\r\nPosted 9/16/12","description_html":"\u003cp\u003eWhat is the current Cody Matlab Release?\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e string\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e'(R2012a)' or 'R2012a'\u003c/p\u003e\u003cp\u003eHint: We have moved forward\u003c/p\u003e\u003cp\u003ePosted 9/16/12\u003c/p\u003e","function_template":"function str = Cody_version\r\n  str='(R2012a)';\r\nend","test_suite":"%%\r\n% 09/21/2012\r\nstr=Cody_version;\r\nlatest=ver;\r\nRelease=latest(1,1).Release;\r\nRelease2= regexprep(Release,'[()]','');\r\nPass= strcmp(str,Release) || strcmp(str,Release2);\r\nassert(isequal(Pass,1))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":175,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-09-16T23:58:44.000Z","updated_at":"2026-02-05T16:40:06.000Z","published_at":"2012-09-17T00:50:33.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWhat is the current Cody Matlab Release?\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e string\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e'(R2012a)' or 'R2012a'\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eHint: We have moved forward\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ePosted 9/16/12\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":43605,"title":"struct2values()","description":"Convert a struct object into a column vector. You can assume that the struct elements are scalars\r\n\r\nExample:\r\n\r\n  a = struct();\r\n  a.b = 1;\r\n  a.c = 4;\r\n  a.e = 55;\r\n\r\nRequested output:\r\n\r\n  [1;4;55]","description_html":"\u003cp\u003eConvert a struct object into a column vector. You can assume that the struct elements are scalars\u003c/p\u003e\u003cp\u003eExample:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ea = struct();\r\na.b = 1;\r\na.c = 4;\r\na.e = 55;\r\n\u003c/pre\u003e\u003cp\u003eRequested output:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e[1;4;55]\r\n\u003c/pre\u003e","function_template":"function vals = your_fcn_name(structobj)\r\n    vals = ??;\r\nend","test_suite":"%%\r\na = struct();\r\na.a = 1;a.b = 2;a.c = 3;\r\ny_correct = [1;2;3];\r\nassert(isequal(your_fcn_name(a),y_correct))\r\n\r\n%%\r\na = struct();\r\na.a = 1;a.b = 2;a.c = 3;a.d = 4;\r\ny_correct = [1;2;3;4];\r\nassert(isequal(your_fcn_name(a),y_correct))","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":29461,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":35,"test_suite_updated_at":"2016-12-05T18:24:07.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2016-10-24T14:52:23.000Z","updated_at":"2026-03-06T13:39:03.000Z","published_at":"2016-10-24T14:52:23.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eConvert a struct object into a column vector. You can assume that the struct elements are scalars\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[a = struct();\\na.b = 1;\\na.c = 4;\\na.e = 55;]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eRequested output:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[[1;4;55]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2037,"title":"Insert structure in a parameter-cell array.","description":"When creating Matlab GUI elements, you can mix value pairs with structures in the list of input arguments, e.g.\r\n\r\n|uicontrol('tag','click',struct('position',[0 0 100 20]),'style','push')|\r\n\r\nSuppose you are creating a function that pre-processes the gui-creation call, and you want to convert the mix of both into a single cell array. That is what this assignment is about. \r\n\r\nYou are creating a function that converts a cell array that may contain structures into a cell array, with the newly added cells in the place of the structures. ","description_html":"\u003cp\u003eWhen creating Matlab GUI elements, you can mix value pairs with structures in the list of input arguments, e.g.\u003c/p\u003e\u003cp\u003e\u003ctt\u003euicontrol('tag','click',struct('position',[0 0 100 20]),'style','push')\u003c/tt\u003e\u003c/p\u003e\u003cp\u003eSuppose you are creating a function that pre-processes the gui-creation call, and you want to convert the mix of both into a single cell array. That is what this assignment is about.\u003c/p\u003e\u003cp\u003eYou are creating a function that converts a cell array that may contain structures into a cell array, with the newly added cells in the place of the structures.\u003c/p\u003e","function_template":"function y = mix2cell(x)\r\n  y = x;\r\nend","test_suite":"%%\r\nx = {'string','blah',struct('position',[10 10 100 20]),'tag','me'};\r\ny = mix2cell(x);\r\ny_correct = {'string','blah','position',[10 10 100 20],'tag','me'};\r\nassert(isequal(y,y_correct))\r\n\r\n%%\r\nx = {'string','blahblah','tag','me'};\r\ny = mix2cell(x);\r\ny_correct = {'string','blahblah','tag','me'};\r\nassert(isequal(y,y_correct))\r\n\r\n%%\r\nx = {'string','blah',struct('value',rand(100),'backgroundcolor',[1 0 1]),'tag','me too',struct('foregroundcolor',[0 1 0.5])};\r\ny = mix2cell(x);\r\ny_correct = {'string','blah','value',x{3}.value,'backgroundcolor',[1 0 1],'tag','me too','foregroundcolor',[0 1 0.5]};\r\nassert(isequal(y,y_correct))\r\n\r\n\r\n%%\r\nx = {'string','blah',struct('string','blahblah'),'string','',struct('string','this one')};\r\ny = mix2cell(x);\r\ny_correct = {'string','blah','string','blahblah','string','','string','this one'};\r\nassert(isequal(y,y_correct))","published":true,"deleted":false,"likes_count":3,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":18,"test_suite_updated_at":"2013-12-06T15:23:35.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-12-06T15:12:34.000Z","updated_at":"2026-02-21T13:42:26.000Z","published_at":"2013-12-06T15:23:35.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWhen creating Matlab GUI elements, you can mix value pairs with structures in the list of input arguments, e.g.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003euicontrol('tag','click',struct('position',[0 0 100 20]),'style','push')\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSuppose you are creating a function that pre-processes the gui-creation call, and you want to convert the mix of both into a single cell array. That is what this assignment is about.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou are creating a function that converts a cell array that may contain structures into a cell array, with the newly added cells in the place of the structures.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":52552,"title":"Undocumented MATLAB tricks No. 1 - Save a function-returned struct","description":"Often we face the case when we want to save a function-returned struct to a mat file with each of its field as individual variables.\r\nFor example, the function returns a struct of 3 fields: a=1,b=2,c=3. Then you should save a file with 3 variables: a=1,b=2,c=3.\r\nThis problem is easy to just solve, but could be difficult to find the best solution of size 13! You may need some undocumented tricks.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.44px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: none solid rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 144px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 72px; transform-origin: 407px 72px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eOften we face the case when we want to save a function-returned struct to a mat file with each of its field as individual variables.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eFor example, the function returns a struct of 3 fields: a=1,b=2,c=3. Then you should save a file with 3 variables: a=1,b=2,c=3.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eThis problem is easy to just solve, but could be difficult to find the best solution of size 13! You may need some undocumented tricks.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function ans=SaveStruct(FilePath,Function)\r\n%No need to give any return values. It's just cody's stupid validation rule that does not allow a function template without a return value.\r\nend","test_suite":"%%\r\n% Generate random variable names and values\r\nValues=unique(randi(100,1,100));\r\nFields=\"F\"+string(Values);\r\nInput=[num2cell(Fields);num2cell(Values)];\r\nStructToSave=struct(Input{:});\r\n% Save the struct\r\nSaveStruct(\"Struct.mat\",@()StructToSave);\r\n% Check if the file matches the struct\r\nassert(isequal(StructToSave,load(\"Struct.mat\")));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":362068,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":"2021-08-16T09:54:05.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2021-08-16T09:34:52.000Z","updated_at":"2021-08-16T09:55:59.000Z","published_at":"2021-08-16T09:54:05.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOften we face the case when we want to save a function-returned struct to a mat file with each of its field as individual variables.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFor example, the function returns a struct of 3 fields: a=1,b=2,c=3. Then you should save a file with 3 variables: a=1,b=2,c=3.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is easy to just solve, but could be difficult to find the best solution of size 13! You may need some undocumented tricks.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":1329,"title":"dir with recursive subdirectory search","description":"Write a function that performs a recursive file search.  The input and output\r\nformat can be identical to the dir function. The result should be a struct with the filenames in the field \"name\".\r\n\r\n\r\n_The first solution is from Kelly Kearney (2006)._\r\n","description_html":"\u003cp\u003eWrite a function that performs a recursive file search.  The input and output\r\nformat can be identical to the dir function. The result should be a struct with the filenames in the field \"name\".\u003c/p\u003e\u003cp\u003e\u003ci\u003eThe first solution is from Kelly Kearney (2006).\u003c/i\u003e\u003c/p\u003e","function_template":"function y = subdir(x)\r\n  y = dir(x);\r\nend","test_suite":"%% count files subdirectories\r\nfiles = subdir(fullfile(matlabroot,'java'));\r\nassert(numel(files)\u003e=595 \u0026 isfield(files,'name'))\r\n\r\n%% count text files\r\nfiles = subdir(fullfile(matlabroot,'*.txt'));\r\n[~,~,ext]=cellfun(@fileparts,{files.name},'UniformOutput',false);\r\nassert(numel(files)\u003e=209 \u0026 isfield(files,'name') \u0026 all(strcmp(ext,'.txt')))\r\n\r\n%%\r\nfiles = subdir(fullfile(matlabroot,'toolbox','*.m'));\r\n[~,~,ext] = cellfun(@fileparts,{files.name},'UniformOutput',false);\r\nassert(numel(files)\u003e=15060 \u0026 isfield(files,'name') \u0026 all(strcmp(ext,'.m')))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":3105,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-03-09T18:24:49.000Z","updated_at":"2013-03-09T19:15:20.000Z","published_at":"2013-03-09T19:08:55.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWrite a function that performs a recursive file search. The input and output format can be identical to the dir function. The result should be a struct with the filenames in the field \\\"name\\\".\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eThe first solution is from Kelly Kearney (2006).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":54650,"title":"Merge structs on fields","description":"Merge a bunch of structs into one, containing the field names and corresponding values of all input structs. For duplicate field names, only the last value is kept.\r\nIf you can reach a size less than 63, you're doing better than my reference solution!","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.44px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: none solid rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 72px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 36px; transform-origin: 407px 36px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eMerge a bunch of structs into one, containing the field names and corresponding values of all input structs. For duplicate field names, only the last value is kept.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 0px 0px; transform-origin: 0px 0px; \"\u003e\u003cspan style=\"\"\u003eIf you can reach a size less than 63, you're doing better than my reference solution!\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function Merged = MergeStructs(varargin)","test_suite":"%%\r\nS1=struct;\r\nassert(isequaln(orderfields(MergeStructs(S1)),S1));\r\n%%\r\nS1=struct(A=table,C=[]);\r\nS2=struct(A=1,B='k');\r\nassert(isequaln(orderfields(MergeStructs(S1,S2)),struct(A=1,B='k',C=[])));\r\n%%\r\nS1=struct(A=\"A\",B='B',C=[]);\r\nS2=struct;\r\nS3=struct(CC=NaN,B=\"\",Z2=missing);\r\nassert(isequaln(orderfields(MergeStructs(S2,S1,S3)),struct(A=\"A\",B=\"\",C=[],CC=NaN,Z2=missing)));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":362068,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2022-05-14T07:24:16.000Z","updated_at":"2022-05-14T07:24:16.000Z","published_at":"2022-05-14T07:24:16.000Z","restored_at":null,"restored_by":null,"spam":null,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMerge a bunch of structs into one, containing the field names and corresponding values of all input structs. For duplicate field names, only the last value is kept.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIf you can reach a size less than 63, you're doing better than my reference solution!\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":42859,"title":"Convert nested struct-array to numeric array","description":"Sometimes data happens to be nicely structured in a struct-array, distributed over various levels of the struct, according to the hierarchy in the logic of the data acquisition.\r\nFor fitting the data, the relevant elements of the struct-array need to be converted to a simple, multi-dimensional numeric array.\r\n\r\nThat will be your assignment.\r\n\r\nCreate a function struct2mat that takes a struct-array as an input, and returns an array, where dimensions of the output data correspond to the struc-array levels in incremental order. The first output level enters dimension 1 of the output, the 2nd dimension 2, etc.\r\n\r\n  datastruct(1).level2(1).level3(1).data = 1:4;\r\n  ...\r\n  datastruct(4).level2(3).level3(2).data = 4321:4324;\r\n\r\n  dataarray = struct2mat(datastruct)\r\n\r\nshould result in \r\n\r\n  dataarray(1,1,1,1) = 1;\r\n  ...\r\n  dataarray(1,1,1,4) = 4;\r\n  ...\r\n  dataarray(4,3,2,3) = 4323;\r\n\r\n\u003c\u003chttp://i64.tinypic.com/zkrbm1.jpg\u003e\u003e\r\n\r\nI encourage you to write a function that does not use loops to access the different struct-array levels.","description_html":"\u003cp\u003eSometimes data happens to be nicely structured in a struct-array, distributed over various levels of the struct, according to the hierarchy in the logic of the data acquisition.\r\nFor fitting the data, the relevant elements of the struct-array need to be converted to a simple, multi-dimensional numeric array.\u003c/p\u003e\u003cp\u003eThat will be your assignment.\u003c/p\u003e\u003cp\u003eCreate a function struct2mat that takes a struct-array as an input, and returns an array, where dimensions of the output data correspond to the struc-array levels in incremental order. The first output level enters dimension 1 of the output, the 2nd dimension 2, etc.\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edatastruct(1).level2(1).level3(1).data = 1:4;\r\n...\r\ndatastruct(4).level2(3).level3(2).data = 4321:4324;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edataarray = struct2mat(datastruct)\r\n\u003c/pre\u003e\u003cp\u003eshould result in\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edataarray(1,1,1,1) = 1;\r\n...\r\ndataarray(1,1,1,4) = 4;\r\n...\r\ndataarray(4,3,2,3) = 4323;\r\n\u003c/pre\u003e\u003cimg src = \"http://i64.tinypic.com/zkrbm1.jpg\"\u003e\u003cp\u003eI encourage you to write a function that does not use loops to access the different struct-array levels.\u003c/p\u003e","function_template":"function mat = struct2mat(s)\r\n  c = struct2cell(s);\r\n  mat = [c{:}];\r\nend","test_suite":"%%\r\ndata_ref_temp = rand(5,4,3,2);\r\ndata.siz = size(data_ref_temp);\r\nglobal data\r\n\r\nfor i1 = 1:data.siz(1)\r\n    data.altitude.location(i1) = rand;\r\n    for i2 = 1:data.siz(2)\r\n        data.floor.location(i1).room(i2) = rand;\r\n        for i3 = 1:data.siz(3)\r\n            data.scale.location(i1).room(i2).device(i3) = rand;\r\n            for i4 = 1:data.siz(4)\r\n                data.temperature.location(i1).room(i2).device(i3).sample(i4) = data_ref_temp(i1,i2,i3,i4);\r\n                data.timestamp.location(i1).room(i2).device(i3).sample(i4) = i4;\r\n            end\r\n        end\r\n    end\r\nend\r\n\r\nassert(isequal(struct2mat(data.temperature),data_ref_temp))\r\n\r\n%%\r\nglobal data\r\ndata_ref_time = repmat(shiftdim(1:data.siz(4),-2),data.siz(1:3));\r\nassert(isequal(struct2mat(data.timestamp),data_ref_time))\r\n\r\n%%\r\nglobal data\r\nassert(isequal(struct2mat(data.altitude),data.altitude.location.'))\r\n\r\n%%\r\nglobal data\r\nassert(isequal(struct2mat(data.floor),cat(1,data.floor.location.room)))\r\n\r\n%%\r\nglobal data\r\ndata.scale.location;[ans.room];[ans.device];\r\nassert(isequal(struct2mat(data.scale),permute(reshape(ans,3,4,5),[3 2 1])))\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-05-23T07:59:17.000Z","updated_at":"2016-05-23T09:37:39.000Z","published_at":"2016-05-23T09:37:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSometimes data happens to be nicely structured in a struct-array, distributed over various levels of the struct, according to the hierarchy in the logic of the data acquisition. For fitting the data, the relevant elements of the struct-array need to be converted to a simple, multi-dimensional numeric array.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThat will be your assignment.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCreate a function struct2mat that takes a struct-array as an input, and returns an array, where dimensions of the output data correspond to the struc-array levels in incremental order. The first output level enters dimension 1 of the output, the 2nd dimension 2, etc.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[datastruct(1).level2(1).level3(1).data = 1:4;\\n...\\ndatastruct(4).level2(3).level3(2).data = 4321:4324;\\n\\ndataarray = struct2mat(datastruct)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eshould result in\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[dataarray(1,1,1,1) = 1;\\n...\\ndataarray(1,1,1,4) = 4;\\n...\\ndataarray(4,3,2,3) = 4323;]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eI encourage you to write a function that does not use loops to access the different struct-array levels.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"},{"id":2122,"title":"Simple Robotics 2 - End effector attitude","description":"Given a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\r\n\r\nWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\r\n\r\nYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\r\n\r\nTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\r\n\r\nTip2: alfa1 in the picture is negative.\r\n\r\nTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\r\n\r\nAs a visual reference, check the picture below.\r\n\r\n\u003c\u003chttp://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\u003e\u003e","description_html":"\u003cp\u003eGiven a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\u003c/p\u003e\u003cp\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\u003c/p\u003e\u003cp\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\u003c/p\u003e\u003cp\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\u003c/p\u003e\u003cp\u003eTip2: alfa1 in the picture is negative.\u003c/p\u003e\u003cp\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\u003c/p\u003e\u003cp\u003eAs a visual reference, check the picture below.\u003c/p\u003e\u003cimg src = \"http://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\"\u003e","function_template":"function newrobot = forwardkinematics(oldrobot)\r\n%   * robot.links(L1,L2,L3)\r\n% * robot.jointangles(alfa1,alfa2,alfa3)\r\n% * robot.attitude(x,y,tht)\r\nend","test_suite":"%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[0 0 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0 sum(robot.links) pi/2];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 0  0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[-0.5*sqrt(2)*sum(robot.links) 0.5*sqrt(2)*sum(robot.links) 3*pi/4];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 pi 3*pi/4];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.5*sqrt(2)*(robot.links(1)-robot.links(2)) 0.5*sqrt(2)*(robot.links(1)-robot.links(2))+robot.links(3) pi/2]\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-pi/4 pi/4 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0.5*sqrt(2)*robot.links(1) 0.5*sqrt(2)*robot.links(1)+sum(robot.links(2:3)) pi/2];\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-2.1513    2.9568    2.8725];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.246878929631356  -0.220349832044192   5.248796326794897]\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.0919    1.8867   -2.2501];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.260952279814086   0.667368060676958   1.115496326794896];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.4916    2.6121    1.8360];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.070611406176580  -0.000086942065283   5.527296326794897];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":20079,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-01-16T04:52:06.000Z","updated_at":"2014-01-25T01:02:46.000Z","published_at":"2014-01-24T01:47:31.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven a structure as input to your function with the following fields: * robot.links(L1,L2,L3) * robot.jointangles(alfa1,alfa2,alfa3) * robot.attitude(x,y,tht) Return the same struct with the correct end effector position and orientation in \\\"robot.attitude\\\". In a stretched out posture, the end effector angle is 0. In other words calculate the end effector x,y and alfa.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTip2: alfa1 in the picture is negative.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eAs a visual reference, check the picture below.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"}],"term":"tag:\"struct\"","current_player_id":null,"fields":[{"name":"page","type":"integer","callback":null,"default":1,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"per_page","type":"integer","callback":null,"default":50,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"sort","type":"string","callback":null,"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"body","type":"text","callback":null,"default":"*:*","directive":null,"facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":false},{"name":"group","type":"string","callback":null,"default":null,"directive":"group","facet":true,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"difficulty_rating_bin","type":"string","callback":null,"default":null,"directive":"difficulty_rating_bin","facet":true,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"id","type":"integer","callback":null,"default":null,"directive":"id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"tag","type":"string","callback":null,"default":null,"directive":"tag","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"product","type":"string","callback":null,"default":null,"directive":"product","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"created_at","type":"timeframe","callback":{},"default":null,"directive":"created_at","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"profile_id","type":"integer","callback":null,"default":null,"directive":"author_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"created_by","type":"string","callback":null,"default":null,"directive":"author","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"player_id","type":"integer","callback":null,"default":null,"directive":"solver_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"player","type":"string","callback":null,"default":null,"directive":"solver","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"solvers_count","type":"integer","callback":null,"default":null,"directive":"solvers_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"comments_count","type":"integer","callback":null,"default":null,"directive":"comments_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"likes_count","type":"integer","callback":null,"default":null,"directive":"likes_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"leader_id","type":"integer","callback":null,"default":null,"directive":"leader_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"leading_solution","type":"integer","callback":null,"default":null,"directive":"leading_solution","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true}],"filters":[{"name":"asset_type","type":"string","callback":null,"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":"\"cody:problem\"","prepend":true},{"name":"profile_id","type":"integer","callback":{},"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":"author_id","static":null,"prepend":true}],"query":{"params":{"per_page":50,"term":"tag:\"struct\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"struct\"","","\"","struct","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f76f7a23a30\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f76f7a23990\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f76f7a230d0\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f76f7a23cb0\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f76f7a23c10\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f76f7a23b70\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f76f7a23ad0\u003e":"tag:\"struct\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f76f7a23ad0\u003e":"tag:\"struct\""},"queried_facets":{}},"query_backend":{"connection":{"configuration":{"index_url":"http://index-op-v2/solr/","query_url":"http://search-op-v2/solr/","direct_access_index_urls":["http://index-op-v2/solr/"],"direct_access_query_urls":["http://search-op-v2/solr/"],"timeout":10,"vhost":"search","exchange":"search.topic","heartbeat":30,"pre_index_mode":false,"host":"rabbitmq-eks","port":5672,"username":"search","password":"J3bGPZzQ7asjJcCk","virtual_host":"search","indexer":"amqp","http_logging":"true","core":"cody"},"query_connection":{"uri":"http://search-op-v2/solr/cody/","proxy":null,"connection":{"parallel_manager":null,"headers":{"User-Agent":"Faraday v1.0.1"},"params":{},"options":{"params_encoder":"Faraday::FlatParamsEncoder","proxy":null,"bind":null,"timeout":null,"open_timeout":null,"read_timeout":null,"write_timeout":null,"boundary":null,"oauth":null,"context":null,"on_data":null},"ssl":{"verify":true,"ca_file":null,"ca_path":null,"verify_mode":null,"cert_store":null,"client_cert":null,"client_key":null,"certificate":null,"private_key":null,"verify_depth":null,"version":null,"min_version":null,"max_version":null},"default_parallel_manager":null,"builder":{"adapter":{"name":"Faraday::Adapter::NetHttp","args":[],"block":null},"handlers":[{"name":"Faraday::Response::RaiseError","args":[],"block":null}],"app":{"app":{"ssl_cert_store":{"verify_callback":null,"error":null,"error_string":null,"chain":null,"time":null},"app":{},"connection_options":{},"config_block":null}}},"url_prefix":"http://search-op-v2/solr/cody/","manual_proxy":false,"proxy":null},"update_format":"RSolr::JSON::Generator","update_path":"update","options":{"url":"http://search-op-v2/solr/cody"}}},"query":{"params":{"per_page":50,"term":"tag:\"struct\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"struct\"","","\"","struct","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f76f7a23a30\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f76f7a23990\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f76f7a230d0\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f76f7a23cb0\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f76f7a23c10\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f76f7a23b70\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f76f7a23ad0\u003e":"tag:\"struct\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f76f7a23ad0\u003e":"tag:\"struct\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":950,"difficulty_rating":"easy"},{"id":43605,"difficulty_rating":"easy"},{"id":2037,"difficulty_rating":"easy-medium"},{"id":52552,"difficulty_rating":"medium"},{"id":1329,"difficulty_rating":"medium"},{"id":54650,"difficulty_rating":"medium"},{"id":42859,"difficulty_rating":"medium"},{"id":2122,"difficulty_rating":"unrated"}]}}