{"group":{"id":1,"name":"Community","lockable":false,"created_at":"2012-01-18T18:02:15.000Z","updated_at":"2026-04-06T14:01:22.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":"2026-04-06T00: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":921,"title":"REPMAT  Enhancement - Faster for Large Row Replication of Vector ","description":"The Challenge is to modify repmat.m to maintain all of its normal functionality and enhance its performance for large row replication for both N=1 and N\u003e1 cases,\r\nB=repmat(A,M,N).  The size of A for enhancement cases is [1,n].\r\n\r\nFor cases of M\u003e 12,288,000 and n\u003c128 or N*n\u003c256 it is possible to perform an enhanced repmat in 40% of the time of repmat. The standard repmat takes 150% longer than repmatLV in certain cases on Cody (2.5 sec / 1 sec).\r\n\r\n*Input:* [A,M,N]  standard input for repmat\r\n\r\n* A: Vector (row or column) or an array\r\n* M: row duplication factor of A\r\n* N: column replication factor of A\r\n\r\n*Output:* B, Array of size [M*m,N*n] where [m,n]=size(A)\r\n\r\n*Score:* Performance is based upon time(msec) to execute four large row replications\r\n\r\nTest Cases include normal arrays for which the function must still maintain repmat capability and also the large test cases:\r\n\r\n* 1: r [1,12] of uint32, M=6144000, N=4\r\n* 2: r [1,12] of uint8, M=6144000, N=16\r\n* 3: r [1,48] of uint32, M=6144000, N=1\r\n* 4: r [1,48] of uint8, M=12288000, N=1\r\n* Test cases are sized to not hit the memory limit and clears are implemented.\r\n\r\n\r\n*Potential Path:*\r\n\r\nI suggest replicating repmat.m to a local folder and name it repmatLV.m. Create a shell that calls repmatLV as if it was repmat. Implement calls of the stressing test cases from the shell. Use the Profiler Tool to analyze where time is being consumed and devise alternative speed enhancements.\r\n\r\n# command window; open repmat\r\n# file: save as: to local folder with new name\r\n# Create Shell calling function\r\n# From the Editor/Shell; Tools: Open Profiler\r\n# From Profiler Window:  Start Profiling  (Fourth row top left)\r\n# Explore the results of the profiler windows\r\n\r\nNote: The above cases assume a 3GB system or better. Reduce M as necessary.\r\n\r\n\r\nThe overall goal of this challenge is to show that matlab built-in functions are excellent resources for methods, optimization of functions is possible depending on individual needs, and profiling is fun.\r\n\r\nA follow-up Challenge will demonstrate an optimization of ismember, for the 'sortrows' option with many rows, when both arrays have many rows vs columns and have low commonality(\u003c 10%). Processing time can be reduced by more than 90% for these large row dominant arrays compared to the standard ismember time. \r\n\r\n\r\nEnjoy.","description_html":"\u003cp\u003eThe Challenge is to modify repmat.m to maintain all of its normal functionality and enhance its performance for large row replication for both N=1 and N\u003e1 cases,\r\nB=repmat(A,M,N).  The size of A for enhancement cases is [1,n].\u003c/p\u003e\u003cp\u003eFor cases of M\u003e 12,288,000 and n\u0026lt;128 or N*n\u0026lt;256 it is possible to perform an enhanced repmat in 40% of the time of repmat. The standard repmat takes 150% longer than repmatLV in certain cases on Cody (2.5 sec / 1 sec).\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [A,M,N]  standard input for repmat\u003c/p\u003e\u003cul\u003e\u003cli\u003eA: Vector (row or column) or an array\u003c/li\u003e\u003cli\u003eM: row duplication factor of A\u003c/li\u003e\u003cli\u003eN: column replication factor of A\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e B, Array of size [M*m,N*n] where [m,n]=size(A)\u003c/p\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Performance is based upon time(msec) to execute four large row replications\u003c/p\u003e\u003cp\u003eTest Cases include normal arrays for which the function must still maintain repmat capability and also the large test cases:\u003c/p\u003e\u003cul\u003e\u003cli\u003e1: r [1,12] of uint32, M=6144000, N=4\u003c/li\u003e\u003cli\u003e2: r [1,12] of uint8, M=6144000, N=16\u003c/li\u003e\u003cli\u003e3: r [1,48] of uint32, M=6144000, N=1\u003c/li\u003e\u003cli\u003e4: r [1,48] of uint8, M=12288000, N=1\u003c/li\u003e\u003cli\u003eTest cases are sized to not hit the memory limit and clears are implemented.\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cb\u003ePotential Path:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eI suggest replicating repmat.m to a local folder and name it repmatLV.m. Create a shell that calls repmatLV as if it was repmat. Implement calls of the stressing test cases from the shell. Use the Profiler Tool to analyze where time is being consumed and devise alternative speed enhancements.\u003c/p\u003e\u003col\u003e\u003cli\u003ecommand window; open repmat\u003c/li\u003e\u003cli\u003efile: save as: to local folder with new name\u003c/li\u003e\u003cli\u003eCreate Shell calling function\u003c/li\u003e\u003cli\u003eFrom the Editor/Shell; Tools: Open Profiler\u003c/li\u003e\u003cli\u003eFrom Profiler Window:  Start Profiling  (Fourth row top left)\u003c/li\u003e\u003cli\u003eExplore the results of the profiler windows\u003c/li\u003e\u003c/ol\u003e\u003cp\u003eNote: The above cases assume a 3GB system or better. Reduce M as necessary.\u003c/p\u003e\u003cp\u003eThe overall goal of this challenge is to show that matlab built-in functions are excellent resources for methods, optimization of functions is possible depending on individual needs, and profiling is fun.\u003c/p\u003e\u003cp\u003eA follow-up Challenge will demonstrate an optimization of ismember, for the 'sortrows' option with many rows, when both arrays have many rows vs columns and have low commonality(\u0026lt; 10%). Processing time can be reduced by more than 90% for these large row dominant arrays compared to the standard ismember time.\u003c/p\u003e\u003cp\u003eEnjoy.\u003c/p\u003e","function_template":"function B = repmatLV(A,M,N)\r\n% B=repmat(A,M,N);  % Will create a Passing solution - but slow\r\n  B=A;\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',0);\r\n%%\r\n% Testing for standard repmat capability\r\na=magic(5);\r\nM=randi(4);\r\nN=randi(8);\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=5;\r\nM=randi(10);\r\nN=randi(10);\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=5;\r\nM=randi(10);\r\nN=1;\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=4;\r\nM=1;\r\nN=randi(10);\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=magic(8);\r\nM=2;\r\nN=2;\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\n%%\r\nM=1024;\r\nN=1;\r\nn=48;\r\nr=randi(255,1,n,'uint8');\r\n%r=double(r);\r\n\r\nfor i=1:5  % Routine warm-up\r\n  r_repmatLV=repmatLV(r,M,N);\r\nend\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=6144000;\r\nN=4;\r\nn=12;\r\nr=randi(2^31,1,n,'uint32');\r\n\r\nta=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt1=etime(clock,ta)*1000;\r\nP1=isequal(r(1,12),r_repmatLV(M,n*N));\r\nP2=isequal(r(1,12),r_repmatLV(randi(10000),36));\r\nassert(P1 \u0026\u0026 P2  \u0026\u0026 ~ P3  \u0026\u0026 ~P4)\r\n\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=6144000;\r\nN=16;\r\nn=12;\r\nr=randi(255,1,n,'uint8');\r\n\r\ntb=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt2=etime(clock,tb)*1000;\r\nP2=isequal(r(1,12),r_repmatLV(M,n*N));\r\nassert(P2 \u0026\u0026 ~P1  \u0026\u0026 ~ P3  \u0026\u0026 ~P4)\r\n\r\n\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=6144000;\r\nN=1;\r\nn=48;\r\nr=randi(2^31,1,n,'uint32');\r\n\r\ntc=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt3=etime(clock,tc)*1000;\r\nP3=isequal(r(1,1),r_repmatLV(M,1));\r\nassert(P3 \u0026\u0026 ~P1  \u0026\u0026 ~ P2  \u0026\u0026 ~P4)\r\n\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=12288000;\r\nN=1;\r\nn=48;\r\nr=randi(255,1,n,'uint8');\r\n\r\ntd=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt4=etime(clock,td)*1000;\r\nP4=isequal(r(1,48),r_repmatLV(1000000,48));\r\nassert(P4 \u0026\u0026 ~P3  \u0026\u0026 ~ P2  \u0026\u0026 ~P1)\r\n\r\nclear r_repmatLV\r\n% This checks for sub-optimal column processing\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=64;\r\nN=1;\r\nn=4000000;\r\nr=randi(255,1,n,'uint8');\r\n\r\nte=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt5=etime(clock,te)*1000;\r\nP5=isequal(r(1,n),r_repmatLV(M,n));\r\nassert(P5)\r\n\r\nfeval(@assignin,'caller','score',0);\r\nif P5\r\n sum_dt=min(15000,t1+t2+t3+t4+t5); % repmat scores 12000\r\n feval(@assignin,'caller','score',floor(sum_dt));\r\nend\r\n\r\nfprintf('Times: %.0f %.0f %.0f %.0f %.0f  Total %.0f msec\\n',t1,t2,t3,t4,t5,t1+t2+t3+t4+t5)\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":18,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-08-25T20:11:30.000Z","updated_at":"2026-03-11T11:30:11.000Z","published_at":"2012-08-26T00:53:53.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\u003eThe Challenge is to modify repmat.m to maintain all of its normal functionality and enhance its performance for large row replication for both N=1 and N\u0026gt;1 cases, B=repmat(A,M,N). The size of A for enhancement cases is [1,n].\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\u003eFor cases of M\u0026gt; 12,288,000 and n\u0026lt;128 or N*n\u0026lt;256 it is possible to perform an enhanced repmat in 40% of the time of repmat. The standard repmat takes 150% longer than repmatLV in certain cases on Cody (2.5 sec / 1 sec).\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\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [A,M,N] standard input for repmat\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eA: Vector (row or column) or an array\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM: row duplication factor of A\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eN: column replication factor of A\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 B, Array of size [M*m,N*n] where [m,n]=size(A)\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Performance is based upon time(msec) to execute four large row replications\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\u003eTest Cases include normal arrays for which the function must still maintain repmat capability and also the large test cases:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e1: r [1,12] of uint32, M=6144000, N=4\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e2: r [1,12] of uint8, M=6144000, N=16\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e3: r [1,48] of uint32, M=6144000, N=1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e4: r [1,48] of uint8, M=12288000, N=1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTest cases are sized to not hit the memory limit and clears are implemented.\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\u003ePotential Path:\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\u003eI suggest replicating repmat.m to a local folder and name it repmatLV.m. Create a shell that calls repmatLV as if it was repmat. Implement calls of the stressing test cases from the shell. Use the Profiler Tool to analyze where time is being consumed and devise alternative speed enhancements.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ecommand window; open repmat\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003efile: save as: to local folder with new name\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCreate Shell calling function\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFrom the Editor/Shell; Tools: Open Profiler\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFrom Profiler Window: Start Profiling (Fourth row top left)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExplore the results of the profiler windows\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\u003eNote: The above cases assume a 3GB system or better. Reduce M as necessary.\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\u003eThe overall goal of this challenge is to show that matlab built-in functions are excellent resources for methods, optimization of functions is possible depending on individual needs, and profiling is fun.\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\u003eA follow-up Challenge will demonstrate an optimization of ismember, for the 'sortrows' option with many rows, when both arrays have many rows vs columns and have low commonality(\u0026lt; 10%). Processing time can be reduced by more than 90% for these large row dominant arrays compared to the standard ismember time.\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\u003eEnjoy.\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":850,"title":"Spectral Distance - Speed Scoring","description":"Find quantity of pixels within a spectral distance from a given [r,g,b] spectra.\r\n\r\n*Spectral distance* = sqrt( (r0-ri)^2+(g0-gi)^2+(b0-bi)^2) where [r0,g0,b0] is the target spectra (0:255) and [ri,gi,bi] are from an image pixel.\r\n\r\nTwo warm-up timing prep runs will be executed against a 512x512 sub-section.\r\n\r\nTiming run will be against a 2036x3060 image : concordaerial.png\r\n\r\nA second test will select a random point in a small window to confirm accuracy.\r\nUnfortunately bwdist does not appear to work in Cody.\r\n\r\n\r\n*Ranking* will be based upon speed. Accuracy is still required.\r\n\r\n*Input:* [image array, spectra, threshold distance] \r\n\r\nimage array [ x, y, 3 ]  % Higher order images is a future activity\r\n\r\nspectra [ r g b]\r\n\r\n*Output:* [ N ]  number of pixels within(\u003c=) threshold distance\r\n\r\nPixel count tolerance of 1% is allowed\r\n\r\n\r\nThe right to update the test points/thresholds is reserved in case of shenanigans.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.4333px; 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: rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 393px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 196.5px; transform-origin: 407px 196.5px; vertical-align: baseline; \"\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: 238px 8px; transform-origin: 238px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eFind quantity of pixels within a spectral distance from a given [r,g,b] spectra.\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: 61px 8px; transform-origin: 61px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eSpectral distance\u003c/span\u003e\u003c/span\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: 311.5px 8px; transform-origin: 311.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e = sqrt( (r0-ri)^2+(g0-gi)^2+(b0-bi)^2) where [r0,g0,b0] is the target spectra (0:255) and [ri,gi,bi] are from an image pixel.\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: 246.5px 8px; transform-origin: 246.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTwo warm-up timing prep runs will be executed against a 512x512 sub-section.\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: 206px 8px; transform-origin: 206px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTiming run will be against a 2036x3060 image : concordaerial.png\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: 374.5px 8px; transform-origin: 374.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eA second test will select a random point in a small window to confirm accuracy. Unfortunately bwdist does not appear to work in Cody.\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: 28.5px 8px; transform-origin: 28.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eRanking\u003c/span\u003e\u003c/span\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: 164.5px 8px; transform-origin: 164.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e will be based upon speed. Accuracy is still required.\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: 20px 8px; transform-origin: 20px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eInput:\u003c/span\u003e\u003c/span\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: 132.5px 8px; transform-origin: 132.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e [image array, spectra, threshold distance]\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: 196.5px 8px; transform-origin: 196.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eimage array [ x, y, 3 ] % Higher order images is a future activity\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: 46px 8px; transform-origin: 46px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003espectra [ r g b]\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: 26px 8px; transform-origin: 26px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eOutput:\u003c/span\u003e\u003c/span\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: 160.5px 8px; transform-origin: 160.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e [ N ] number of pixels within(\u0026lt;=) threshold distance\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: 118px 8px; transform-origin: 118px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003ePixel count tolerance of 1% is allowed\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: 256px 8px; transform-origin: 256px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe right to update the test points/thresholds is reserved in case of shenanigans.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function N = spectral_dist(A,S,d)\r\n% A is array [x,y,3]\r\n% S is the Spectra zero [r g b]\r\n% d is the spectral distance limt - double\r\n  N=0;\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',2000);\r\n%%\r\nglobal As dt\r\n %A=imread('concordaerial.png');\r\n A=imread(fullfile(matlabroot,'toolbox','images','imdata','concordaerial.png'));\r\n size(A); % 2036 x 3060\r\n As=A(1:512,1:512,:);\r\n\r\nS=squeeze(A(1182,1672,:))'; % Golf Course\r\nd=sqrt(3);\r\nN_expect=730;\r\n\r\n% Small warm-up calls 512x512\r\n N = spectral_dist(As,S,d);\r\n N = spectral_dist(As,S,d);\r\n% A big warm-up call\r\n N = spectral_dist(A,S,d);\r\nt0=clock;\r\n N = spectral_dist(A,S,d);\r\ndt=etime(clock,t0)*1000; % ms\r\nfprintf('N= %i  Time to process %.0f msec\\n',N,dt);\r\nPass=0.99*N_expect\u003cN \u0026\u0026 N\u003c1.01*N_expect;\r\nassert(Pass==1,sprintf('N_exp=730  N= %.0f\\n',N))\r\n\r\n%%\r\nglobal As dt\r\ntemp=dt; % anti-cheat\r\n\r\n%randomize random\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n% Select random point in As sub-window for anti-cheat purposes\r\nx=randi(512,1,1);\r\ny=randi(512,1,1);\r\n\r\nS=squeeze(As(x,y,:))'; % \r\nd=sqrt(17);\r\n\r\n N = spectral_dist(As,S,d);\r\n\r\ndt=temp;\r\n\r\n S=double(S);\r\n As=double(As);\r\n N_expect=0;\r\n for i=1:512\r\n  for j=1:512\r\n    dr2=(S(1)-As(i,j,1))^2;\r\n    dg2=(S(2)-As(i,j,2))^2;\r\n    db2=(S(3)-As(i,j,3))^2;\r\n   if sqrt(dr2+dg2+db2)\u003c=d\r\n    N_expect=N_expect+1;\r\n   end\r\n  end\r\n end\r\n\r\nfprintf('x=%i  y=%i  N= %i  N_expect=%i\\n',x,y,N,N_expect);\r\n\r\nPass=0.99*N_expect\u003cN \u0026\u0026 N\u003c1.01*N_expect;\r\n\r\ndt=temp; % anti-cheat\r\n\r\nassert(Pass==1,sprintf('x= %i y=%i N_exp=%.0f  N= %.0f\\n',x,y,N_expect,N))\r\n%%\r\nglobal dt\r\n%Write file based on time in test 1\r\nnet_time=dt;\r\n% net_time in ms\r\n% Create graph data\r\nnet_time=min(2000,net_time); % Limit graph y-axis\r\nfeval(@assignin,'caller','score',floor(net_time));\r\n\r\n%fh=fopen('spectral_dist.m','wt');\r\n%fprintf(fh,'%s\\n',repmat('1;',[1,round(net_time/2)]));\r\n%fclose(fh);\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":10,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":10,"test_suite_updated_at":"2020-10-26T16:33:16.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-07-20T03:11:11.000Z","updated_at":"2020-10-26T16:33:16.000Z","published_at":"2012-07-23T00:43:36.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\u003eFind quantity of pixels within a spectral distance from a given [r,g,b] spectra.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eSpectral distance\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e = sqrt( (r0-ri)^2+(g0-gi)^2+(b0-bi)^2) where [r0,g0,b0] is the target spectra (0:255) and [ri,gi,bi] are from an image pixel.\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\u003eTwo warm-up timing prep runs will be executed against a 512x512 sub-section.\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\u003eTiming run will be against a 2036x3060 image : concordaerial.png\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\u003eA second test will select a random point in a small window to confirm accuracy. Unfortunately bwdist does not appear to work in Cody.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eRanking\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e will be based upon speed. Accuracy is still required.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [image array, spectra, threshold distance]\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\u003eimage array [ x, y, 3 ] % Higher order images is a future activity\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\u003espectra [ r g b]\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: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 [ N ] number of pixels within(\u0026lt;=) threshold distance\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\u003ePixel count tolerance of 1% is allowed\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\u003eThe right to update the test points/thresholds is reserved in case of shenanigans.\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\"}]}"}],"problem_search":{"errors":[],"problems":[{"id":921,"title":"REPMAT  Enhancement - Faster for Large Row Replication of Vector ","description":"The Challenge is to modify repmat.m to maintain all of its normal functionality and enhance its performance for large row replication for both N=1 and N\u003e1 cases,\r\nB=repmat(A,M,N).  The size of A for enhancement cases is [1,n].\r\n\r\nFor cases of M\u003e 12,288,000 and n\u003c128 or N*n\u003c256 it is possible to perform an enhanced repmat in 40% of the time of repmat. The standard repmat takes 150% longer than repmatLV in certain cases on Cody (2.5 sec / 1 sec).\r\n\r\n*Input:* [A,M,N]  standard input for repmat\r\n\r\n* A: Vector (row or column) or an array\r\n* M: row duplication factor of A\r\n* N: column replication factor of A\r\n\r\n*Output:* B, Array of size [M*m,N*n] where [m,n]=size(A)\r\n\r\n*Score:* Performance is based upon time(msec) to execute four large row replications\r\n\r\nTest Cases include normal arrays for which the function must still maintain repmat capability and also the large test cases:\r\n\r\n* 1: r [1,12] of uint32, M=6144000, N=4\r\n* 2: r [1,12] of uint8, M=6144000, N=16\r\n* 3: r [1,48] of uint32, M=6144000, N=1\r\n* 4: r [1,48] of uint8, M=12288000, N=1\r\n* Test cases are sized to not hit the memory limit and clears are implemented.\r\n\r\n\r\n*Potential Path:*\r\n\r\nI suggest replicating repmat.m to a local folder and name it repmatLV.m. Create a shell that calls repmatLV as if it was repmat. Implement calls of the stressing test cases from the shell. Use the Profiler Tool to analyze where time is being consumed and devise alternative speed enhancements.\r\n\r\n# command window; open repmat\r\n# file: save as: to local folder with new name\r\n# Create Shell calling function\r\n# From the Editor/Shell; Tools: Open Profiler\r\n# From Profiler Window:  Start Profiling  (Fourth row top left)\r\n# Explore the results of the profiler windows\r\n\r\nNote: The above cases assume a 3GB system or better. Reduce M as necessary.\r\n\r\n\r\nThe overall goal of this challenge is to show that matlab built-in functions are excellent resources for methods, optimization of functions is possible depending on individual needs, and profiling is fun.\r\n\r\nA follow-up Challenge will demonstrate an optimization of ismember, for the 'sortrows' option with many rows, when both arrays have many rows vs columns and have low commonality(\u003c 10%). Processing time can be reduced by more than 90% for these large row dominant arrays compared to the standard ismember time. \r\n\r\n\r\nEnjoy.","description_html":"\u003cp\u003eThe Challenge is to modify repmat.m to maintain all of its normal functionality and enhance its performance for large row replication for both N=1 and N\u003e1 cases,\r\nB=repmat(A,M,N).  The size of A for enhancement cases is [1,n].\u003c/p\u003e\u003cp\u003eFor cases of M\u003e 12,288,000 and n\u0026lt;128 or N*n\u0026lt;256 it is possible to perform an enhanced repmat in 40% of the time of repmat. The standard repmat takes 150% longer than repmatLV in certain cases on Cody (2.5 sec / 1 sec).\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [A,M,N]  standard input for repmat\u003c/p\u003e\u003cul\u003e\u003cli\u003eA: Vector (row or column) or an array\u003c/li\u003e\u003cli\u003eM: row duplication factor of A\u003c/li\u003e\u003cli\u003eN: column replication factor of A\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e B, Array of size [M*m,N*n] where [m,n]=size(A)\u003c/p\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Performance is based upon time(msec) to execute four large row replications\u003c/p\u003e\u003cp\u003eTest Cases include normal arrays for which the function must still maintain repmat capability and also the large test cases:\u003c/p\u003e\u003cul\u003e\u003cli\u003e1: r [1,12] of uint32, M=6144000, N=4\u003c/li\u003e\u003cli\u003e2: r [1,12] of uint8, M=6144000, N=16\u003c/li\u003e\u003cli\u003e3: r [1,48] of uint32, M=6144000, N=1\u003c/li\u003e\u003cli\u003e4: r [1,48] of uint8, M=12288000, N=1\u003c/li\u003e\u003cli\u003eTest cases are sized to not hit the memory limit and clears are implemented.\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cb\u003ePotential Path:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eI suggest replicating repmat.m to a local folder and name it repmatLV.m. Create a shell that calls repmatLV as if it was repmat. Implement calls of the stressing test cases from the shell. Use the Profiler Tool to analyze where time is being consumed and devise alternative speed enhancements.\u003c/p\u003e\u003col\u003e\u003cli\u003ecommand window; open repmat\u003c/li\u003e\u003cli\u003efile: save as: to local folder with new name\u003c/li\u003e\u003cli\u003eCreate Shell calling function\u003c/li\u003e\u003cli\u003eFrom the Editor/Shell; Tools: Open Profiler\u003c/li\u003e\u003cli\u003eFrom Profiler Window:  Start Profiling  (Fourth row top left)\u003c/li\u003e\u003cli\u003eExplore the results of the profiler windows\u003c/li\u003e\u003c/ol\u003e\u003cp\u003eNote: The above cases assume a 3GB system or better. Reduce M as necessary.\u003c/p\u003e\u003cp\u003eThe overall goal of this challenge is to show that matlab built-in functions are excellent resources for methods, optimization of functions is possible depending on individual needs, and profiling is fun.\u003c/p\u003e\u003cp\u003eA follow-up Challenge will demonstrate an optimization of ismember, for the 'sortrows' option with many rows, when both arrays have many rows vs columns and have low commonality(\u0026lt; 10%). Processing time can be reduced by more than 90% for these large row dominant arrays compared to the standard ismember time.\u003c/p\u003e\u003cp\u003eEnjoy.\u003c/p\u003e","function_template":"function B = repmatLV(A,M,N)\r\n% B=repmat(A,M,N);  % Will create a Passing solution - but slow\r\n  B=A;\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',0);\r\n%%\r\n% Testing for standard repmat capability\r\na=magic(5);\r\nM=randi(4);\r\nN=randi(8);\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=5;\r\nM=randi(10);\r\nN=randi(10);\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=5;\r\nM=randi(10);\r\nN=1;\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=4;\r\nM=1;\r\nN=randi(10);\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\na=magic(8);\r\nM=2;\r\nN=2;\r\nassert(isequal(repmat(a,M,N),repmatLV(a,M,N)));\r\n%%\r\nM=1024;\r\nN=1;\r\nn=48;\r\nr=randi(255,1,n,'uint8');\r\n%r=double(r);\r\n\r\nfor i=1:5  % Routine warm-up\r\n  r_repmatLV=repmatLV(r,M,N);\r\nend\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=6144000;\r\nN=4;\r\nn=12;\r\nr=randi(2^31,1,n,'uint32');\r\n\r\nta=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt1=etime(clock,ta)*1000;\r\nP1=isequal(r(1,12),r_repmatLV(M,n*N));\r\nP2=isequal(r(1,12),r_repmatLV(randi(10000),36));\r\nassert(P1 \u0026\u0026 P2  \u0026\u0026 ~ P3  \u0026\u0026 ~P4)\r\n\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=6144000;\r\nN=16;\r\nn=12;\r\nr=randi(255,1,n,'uint8');\r\n\r\ntb=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt2=etime(clock,tb)*1000;\r\nP2=isequal(r(1,12),r_repmatLV(M,n*N));\r\nassert(P2 \u0026\u0026 ~P1  \u0026\u0026 ~ P3  \u0026\u0026 ~P4)\r\n\r\n\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=6144000;\r\nN=1;\r\nn=48;\r\nr=randi(2^31,1,n,'uint32');\r\n\r\ntc=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt3=etime(clock,tc)*1000;\r\nP3=isequal(r(1,1),r_repmatLV(M,1));\r\nassert(P3 \u0026\u0026 ~P1  \u0026\u0026 ~ P2  \u0026\u0026 ~P4)\r\n\r\n\r\nclear r_repmatLV\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=12288000;\r\nN=1;\r\nn=48;\r\nr=randi(255,1,n,'uint8');\r\n\r\ntd=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt4=etime(clock,td)*1000;\r\nP4=isequal(r(1,48),r_repmatLV(1000000,48));\r\nassert(P4 \u0026\u0026 ~P3  \u0026\u0026 ~ P2  \u0026\u0026 ~P1)\r\n\r\nclear r_repmatLV\r\n% This checks for sub-optimal column processing\r\nP1=false; P2=false; P3=false;P4=false;\r\nM=64;\r\nN=1;\r\nn=4000000;\r\nr=randi(255,1,n,'uint8');\r\n\r\nte=clock;\r\n r_repmatLV=repmatLV(r,M,N);\r\nt5=etime(clock,te)*1000;\r\nP5=isequal(r(1,n),r_repmatLV(M,n));\r\nassert(P5)\r\n\r\nfeval(@assignin,'caller','score',0);\r\nif P5\r\n sum_dt=min(15000,t1+t2+t3+t4+t5); % repmat scores 12000\r\n feval(@assignin,'caller','score',floor(sum_dt));\r\nend\r\n\r\nfprintf('Times: %.0f %.0f %.0f %.0f %.0f  Total %.0f msec\\n',t1,t2,t3,t4,t5,t1+t2+t3+t4+t5)\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":18,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-08-25T20:11:30.000Z","updated_at":"2026-03-11T11:30:11.000Z","published_at":"2012-08-26T00:53:53.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\u003eThe Challenge is to modify repmat.m to maintain all of its normal functionality and enhance its performance for large row replication for both N=1 and N\u0026gt;1 cases, B=repmat(A,M,N). The size of A for enhancement cases is [1,n].\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\u003eFor cases of M\u0026gt; 12,288,000 and n\u0026lt;128 or N*n\u0026lt;256 it is possible to perform an enhanced repmat in 40% of the time of repmat. The standard repmat takes 150% longer than repmatLV in certain cases on Cody (2.5 sec / 1 sec).\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\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [A,M,N] standard input for repmat\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eA: Vector (row or column) or an array\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM: row duplication factor of A\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eN: column replication factor of A\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 B, Array of size [M*m,N*n] where [m,n]=size(A)\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Performance is based upon time(msec) to execute four large row replications\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\u003eTest Cases include normal arrays for which the function must still maintain repmat capability and also the large test cases:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e1: r [1,12] of uint32, M=6144000, N=4\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e2: r [1,12] of uint8, M=6144000, N=16\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e3: r [1,48] of uint32, M=6144000, N=1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e4: r [1,48] of uint8, M=12288000, N=1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTest cases are sized to not hit the memory limit and clears are implemented.\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\u003ePotential Path:\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\u003eI suggest replicating repmat.m to a local folder and name it repmatLV.m. Create a shell that calls repmatLV as if it was repmat. Implement calls of the stressing test cases from the shell. Use the Profiler Tool to analyze where time is being consumed and devise alternative speed enhancements.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ecommand window; open repmat\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003efile: save as: to local folder with new name\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCreate Shell calling function\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFrom the Editor/Shell; Tools: Open Profiler\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFrom Profiler Window: Start Profiling (Fourth row top left)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"2\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExplore the results of the profiler windows\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\u003eNote: The above cases assume a 3GB system or better. Reduce M as necessary.\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\u003eThe overall goal of this challenge is to show that matlab built-in functions are excellent resources for methods, optimization of functions is possible depending on individual needs, and profiling is fun.\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\u003eA follow-up Challenge will demonstrate an optimization of ismember, for the 'sortrows' option with many rows, when both arrays have many rows vs columns and have low commonality(\u0026lt; 10%). Processing time can be reduced by more than 90% for these large row dominant arrays compared to the standard ismember time.\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\u003eEnjoy.\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":850,"title":"Spectral Distance - Speed Scoring","description":"Find quantity of pixels within a spectral distance from a given [r,g,b] spectra.\r\n\r\n*Spectral distance* = sqrt( (r0-ri)^2+(g0-gi)^2+(b0-bi)^2) where [r0,g0,b0] is the target spectra (0:255) and [ri,gi,bi] are from an image pixel.\r\n\r\nTwo warm-up timing prep runs will be executed against a 512x512 sub-section.\r\n\r\nTiming run will be against a 2036x3060 image : concordaerial.png\r\n\r\nA second test will select a random point in a small window to confirm accuracy.\r\nUnfortunately bwdist does not appear to work in Cody.\r\n\r\n\r\n*Ranking* will be based upon speed. Accuracy is still required.\r\n\r\n*Input:* [image array, spectra, threshold distance] \r\n\r\nimage array [ x, y, 3 ]  % Higher order images is a future activity\r\n\r\nspectra [ r g b]\r\n\r\n*Output:* [ N ]  number of pixels within(\u003c=) threshold distance\r\n\r\nPixel count tolerance of 1% is allowed\r\n\r\n\r\nThe right to update the test points/thresholds is reserved in case of shenanigans.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.4333px; 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: rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 393px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 196.5px; transform-origin: 407px 196.5px; vertical-align: baseline; \"\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: 238px 8px; transform-origin: 238px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eFind quantity of pixels within a spectral distance from a given [r,g,b] spectra.\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: 61px 8px; transform-origin: 61px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eSpectral distance\u003c/span\u003e\u003c/span\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: 311.5px 8px; transform-origin: 311.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e = sqrt( (r0-ri)^2+(g0-gi)^2+(b0-bi)^2) where [r0,g0,b0] is the target spectra (0:255) and [ri,gi,bi] are from an image pixel.\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: 246.5px 8px; transform-origin: 246.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTwo warm-up timing prep runs will be executed against a 512x512 sub-section.\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: 206px 8px; transform-origin: 206px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTiming run will be against a 2036x3060 image : concordaerial.png\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: 374.5px 8px; transform-origin: 374.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eA second test will select a random point in a small window to confirm accuracy. Unfortunately bwdist does not appear to work in Cody.\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: 28.5px 8px; transform-origin: 28.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eRanking\u003c/span\u003e\u003c/span\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: 164.5px 8px; transform-origin: 164.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e will be based upon speed. Accuracy is still required.\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: 20px 8px; transform-origin: 20px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eInput:\u003c/span\u003e\u003c/span\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: 132.5px 8px; transform-origin: 132.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e [image array, spectra, threshold distance]\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: 196.5px 8px; transform-origin: 196.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eimage array [ x, y, 3 ] % Higher order images is a future activity\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: 46px 8px; transform-origin: 46px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003espectra [ r g b]\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: 26px 8px; transform-origin: 26px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eOutput:\u003c/span\u003e\u003c/span\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: 160.5px 8px; transform-origin: 160.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e [ N ] number of pixels within(\u0026lt;=) threshold distance\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: 118px 8px; transform-origin: 118px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003ePixel count tolerance of 1% is allowed\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: 256px 8px; transform-origin: 256px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe right to update the test points/thresholds is reserved in case of shenanigans.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function N = spectral_dist(A,S,d)\r\n% A is array [x,y,3]\r\n% S is the Spectra zero [r g b]\r\n% d is the spectral distance limt - double\r\n  N=0;\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',2000);\r\n%%\r\nglobal As dt\r\n %A=imread('concordaerial.png');\r\n A=imread(fullfile(matlabroot,'toolbox','images','imdata','concordaerial.png'));\r\n size(A); % 2036 x 3060\r\n As=A(1:512,1:512,:);\r\n\r\nS=squeeze(A(1182,1672,:))'; % Golf Course\r\nd=sqrt(3);\r\nN_expect=730;\r\n\r\n% Small warm-up calls 512x512\r\n N = spectral_dist(As,S,d);\r\n N = spectral_dist(As,S,d);\r\n% A big warm-up call\r\n N = spectral_dist(A,S,d);\r\nt0=clock;\r\n N = spectral_dist(A,S,d);\r\ndt=etime(clock,t0)*1000; % ms\r\nfprintf('N= %i  Time to process %.0f msec\\n',N,dt);\r\nPass=0.99*N_expect\u003cN \u0026\u0026 N\u003c1.01*N_expect;\r\nassert(Pass==1,sprintf('N_exp=730  N= %.0f\\n',N))\r\n\r\n%%\r\nglobal As dt\r\ntemp=dt; % anti-cheat\r\n\r\n%randomize random\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n% Select random point in As sub-window for anti-cheat purposes\r\nx=randi(512,1,1);\r\ny=randi(512,1,1);\r\n\r\nS=squeeze(As(x,y,:))'; % \r\nd=sqrt(17);\r\n\r\n N = spectral_dist(As,S,d);\r\n\r\ndt=temp;\r\n\r\n S=double(S);\r\n As=double(As);\r\n N_expect=0;\r\n for i=1:512\r\n  for j=1:512\r\n    dr2=(S(1)-As(i,j,1))^2;\r\n    dg2=(S(2)-As(i,j,2))^2;\r\n    db2=(S(3)-As(i,j,3))^2;\r\n   if sqrt(dr2+dg2+db2)\u003c=d\r\n    N_expect=N_expect+1;\r\n   end\r\n  end\r\n end\r\n\r\nfprintf('x=%i  y=%i  N= %i  N_expect=%i\\n',x,y,N,N_expect);\r\n\r\nPass=0.99*N_expect\u003cN \u0026\u0026 N\u003c1.01*N_expect;\r\n\r\ndt=temp; % anti-cheat\r\n\r\nassert(Pass==1,sprintf('x= %i y=%i N_exp=%.0f  N= %.0f\\n',x,y,N_expect,N))\r\n%%\r\nglobal dt\r\n%Write file based on time in test 1\r\nnet_time=dt;\r\n% net_time in ms\r\n% Create graph data\r\nnet_time=min(2000,net_time); % Limit graph y-axis\r\nfeval(@assignin,'caller','score',floor(net_time));\r\n\r\n%fh=fopen('spectral_dist.m','wt');\r\n%fprintf(fh,'%s\\n',repmat('1;',[1,round(net_time/2)]));\r\n%fclose(fh);\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":10,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":10,"test_suite_updated_at":"2020-10-26T16:33:16.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-07-20T03:11:11.000Z","updated_at":"2020-10-26T16:33:16.000Z","published_at":"2012-07-23T00:43:36.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\u003eFind quantity of pixels within a spectral distance from a given [r,g,b] spectra.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eSpectral distance\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e = sqrt( (r0-ri)^2+(g0-gi)^2+(b0-bi)^2) where [r0,g0,b0] is the target spectra (0:255) and [ri,gi,bi] are from an image pixel.\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\u003eTwo warm-up timing prep runs will be executed against a 512x512 sub-section.\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\u003eTiming run will be against a 2036x3060 image : concordaerial.png\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\u003eA second test will select a random point in a small window to confirm accuracy. Unfortunately bwdist does not appear to work in Cody.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eRanking\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e will be based upon speed. Accuracy is still required.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [image array, spectra, threshold distance]\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\u003eimage array [ x, y, 3 ] % Higher order images is a future activity\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\u003espectra [ r g b]\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: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 [ N ] number of pixels within(\u0026lt;=) threshold distance\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\u003ePixel count tolerance of 1% is allowed\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\u003eThe right to update the test points/thresholds is reserved in case of shenanigans.\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\"}]}"}],"term":"tag:\"customization\"","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:\"customization\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"customization\"","","\"","customization","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f69f096d708\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f69f096d668\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f69f096cda8\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f69f096d988\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f69f096d8e8\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f69f096d848\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f69f096d7a8\u003e":"tag:\"customization\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f69f096d7a8\u003e":"tag:\"customization\""},"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":"cody-search","password":"78X075ddcV44","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:\"customization\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"customization\"","","\"","customization","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f69f096d708\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f69f096d668\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f69f096cda8\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f69f096d988\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f69f096d8e8\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f69f096d848\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f69f096d7a8\u003e":"tag:\"customization\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f69f096d7a8\u003e":"tag:\"customization\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":921,"difficulty_rating":"easy-medium"},{"id":850,"difficulty_rating":"easy-medium"}]}}