{"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":58877,"title":"Neural Net Image Convolution: Return only Valid portion of conv2","description":"This challenge is to return only the Valid portion of a 2-D convolution. Valid is deemed to be where all elements of the kernel are applied against the image. The (1,1) point with a ones(3) kernel would be invalid while point (2,2) would return a Valid convolution value. The images will be even-square,m, and the kernels will be odd-square,K.The m=ones(6) and K=ones(3) would return a 4x4 matrix of 9s.\r\nmValidConv2=create_ValidConv2(m,K)\r\nIn neural net processing of the Mnist database of digits(0-9) one Convolutional Neural Network method uses 9x9 kernels on the 28x28 images to return the Valid 20x20 central core for the next processing step. The third image includes a black border of four around Valid to maintain scale.\r\n  \r\nThe entire Matlab code from Convolutional Neural Networks in Matlab by Nuruzzaman Faruqui , a Matlab Neural Net Tutorial for Mnist processing, is included in the function template. Loading the Mnist Train/Test Images/Labels from posted MAT files or THE MNIST DATABASE of handwritten digits are provided. The Neural Net tutorial explains Neural Net processing for Digit Recognition. The neural net training method uses 784 input nodes,  20 convolutions(9x9), ReLU, Pooling, batch sampling, single hidden layer of 100 nodes, updating parameters via backwards propagation, and updating convolution kernels. The digit prediction accuracy is \u003e94% after 50s of training. The final feature kernels are very amorphous and unexpected.","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: 545.5px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 272.75px; transform-origin: 407px 272.75px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 84px; 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 42px; text-align: left; transform-origin: 384px 42px; 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: 369.5px 8px; transform-origin: 369.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis challenge is to return only the Valid portion of a 2-D convolution. Valid is deemed to be where all elements of the kernel are applied against the image. The (1,1) point with a ones(3) kernel would be invalid while point (2,2) would return a Valid convolution value. The images will be even-square,m, and the kernels will be odd-square,K.The m=ones(6) and K=ones(3) would return a 4x4 matrix of 9s.\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: 121.5px 8px; transform-origin: 121.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003emValidConv2=create_ValidConv2(m,K)\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 63px; 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 31.5px; text-align: left; transform-origin: 384px 31.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: 379px 8px; transform-origin: 379px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eIn neural net processing of the Mnist database of digits(0-9) one Convolutional Neural Network method uses 9x9 kernels on the 28x28 images to return the Valid 20x20 central core for the next processing step. The third image includes a black border of four around Valid to maintain scale.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 194.5px; 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 97.25px; text-align: left; transform-origin: 384px 97.25px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 252px;height: 189px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"252\" height=\"189\"\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: 2px 8px; transform-origin: 2px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 252px;height: 189px\" src=\"data:image/png;base64,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JMnSpUtT3FNQULB8+fKWlpaFCxfu2rVr8uTJqb+P6bvmbd+Z8frrr99www3z5s2bOHFi2luSJEmam5vfeOONK664ovuwsLDw008/TXHPoEGDWltba2pqkiTZunVrXV3diSeemOIvaWxpaVm7du3UqVO7D/fv35/uNffJJ5/89cO+ffumteTr6urqUn8zZI8dO3aUlZX1/M0MGTLko48+SnHPl19+uXv37kceeaT7cMaMGanfqP/Opf2uiuhWrVoV4V12W7ZsOeecc1auXLn/fxw8eDDdSY2NjeXl5R988EFXV1dra+u4ceP+9re/pTupx89//vPU32X3z3/+s+ctW9u2bRs3btzq1atT3LN///4xY8asXLmyq6vr888/Hz9+/BtvvJHinm5jx45dtWpV2iv+ZdOmTWeddVb3p/TOnTsvuuiiZ555JsU9W7duLS8v37ZtW1dX17p160aPHr1z584U9xwGrpCyoaamZvfu3dddd13Pn1RVVd15550pTiopKbn99tunTJkycuTIdevWzZgx48ILL0xxTzRlZWWzZ8+urKw866yzNm7cOHPmzHRftz/mmGMefvjhm266adGiRU1NTVdffXXq3xvb2dnZ3t4e5NXQJEnKy8tvu+22adOmDR8+/N133506deqUKVNS3FNUVHTzzTdPmjSpvLx869atDz30UOrfWP1d842x5KSzs7Otre3kk08Ocgsoms7Ozr179x533HFx3iPz1VdfHXvssf69vk33P1l+fn6Qv6KOjo59+/YFebvvd02QAAghyv+1AXCUEyQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABC+G8Tb/bPfPYYhwAAAABJRU5ErkJggg==\" data-image-state=\"image-loaded\" width=\"252\" height=\"189\"\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: 2px 8px; transform-origin: 2px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 252px;height: 189px\" src=\"data:image/png;base64,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PcuyxsbGQ4cONTY2Zlk2f/785ubmjo6OSu8RgAnJQZAuXbq0devW3bt3b9myZeyZ3t7ekydPlhY8fPiwpiYHJwLAj6n0Ldp/8a9//eu11147e/bsw//16NGja9euvfLKK93d3aOjo/39/atXr75w4cKTf9ZbdgAl8d+yi/57SMeOHfvuu++2bdtWeqalpeXTTz9tbW3dtGnTihUrLl++vGPHDr+EBJB3efopu1RNTU1+uA5gTKFQCP5Tdj56ASAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEHKjUKhUOktPCNT5EynyGlmU+ZMp8hplpUgARCCIAEQwrTR0dFK76FcmpqaKr0FgEC6uroqvYUfU81BAiBHvGUHQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIz1V6A/x3g4OD169fLz0sFAqzZ8+u4H7K5OLFi2vWrCk97Ovru3bt2ssvv1x9Eze+f6ZVeXF7enp6e3sbGhpef/310pNVeUGfPNOqvKDPjCDlwKlTp/bv319bWzv28ODBg9//xl0dDh8+fPz48YsXL449PH36dFtb2+rVqzs6Ot5///0PP/ywstubRD840+q7uHv27Dl37tzKlSu7urrq6uqOHj1aW1tblRf0qWdafRf0mRolvI8++uiLL76o9C7KZWho6OOPP37ttdfeeuutsWcePXr02muvdXd3j46O3rlz55e//OU///nPiu5xcjx5pqNVd3GvXLny6quvDg0NjT1ct27dl19+WZUX9KlnOlp1F/QZ8xlSDly9enXJkiWDg4PDw8OV3svkO3DgQENDw2effVZ65sKFC/X19cuWLcuyrKGhYe3ate3t7ZXb4KR58kyzqru49fX1R44cmTNnztjDxYsX37p1qyov6FPPNKu6C/qMecsuupGRkRs3buzZs2doaKhYLG7cuHHv3r2V3tRk2rVrV01Nzfnz50vPFIvF5cuXlx7OmjUr+IjicXryTKvv4i5atGjRokVjX/f29p49e3bbtm1dXV3Vd0GfeqbVd0GfMXdI0fX39zc3Nx85cuTrr7/+6quvLly4cPz48UpvajLV1PzwL+HIyMi0adNKD6dPnz5aFTPpnzzTKr64AwMDH3zwwfbt21955ZVqvaBjvn+mVXxBnw1Biq6xsfHQoUONjY1Zls2fP7+5ubmjo6PSmyqvGTNmPH78uPRwZGRk+vTpFdxP+VTrxf3mm282bNiwefPm7du3Z1V9QX9wptV6QZ8ZQYqut7f35MmTpYcPHz588h/aVeaFF17o7OwsPSwWiytXrqzgfsqnKi/upUuXtm7dunv37i1btow9U60X9MkzrcoL+ix5saJ78ODBrl27enp6siwbGBg4e/bs+vXrK72p8nrjjTeyLBv7rKWnp6e9vX3VqlWV3lRZVN/F7evr27Fjx+eff/7OO+8MDw8PDw+PjIxU5QV96plW3wV9xvxQQ3RNTU2tra2bNm1asWLF5cuXd+zYUfW/1lBTU7Nv376dO3cuXbq0s7Ozra1t3rx5ld5UWVTfxT127Nh33323bdu20jMtLS2ffvpp9V3Q/+tMq+yCPmP+F+b58Pjx4/v378+cOXNKvQPw73//eyqc8tS5uC4oP06QAAhBwAEIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAI4X8AiB24LVwZWacAAAAASUVORK5CYII=\" data-image-state=\"image-loaded\" width=\"252\" height=\"189\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 147px; 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 73.5px; text-align: left; transform-origin: 384px 73.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: 91px 8px; transform-origin: 91px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe entire Matlab code from \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.youtube.com/watch?v=ZOXOwYUVCqw\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eConvolutional Neural Networks in Matlab by Nuruzzaman Faruqui\u003c/span\u003e\u003c/span\u003e\u003c/a\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: 70px 8px; transform-origin: 70px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e , a Matlab Neural Net Tutorial for Mnist processing, is included in the function template. Loading the Mnist Train/Test Images/Labels from posted MAT files or \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"/#null\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eTHE MNIST DATABASE of handwritten digits\u003c/span\u003e\u003c/span\u003e\u003c/a\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: 181.5px 8px; transform-origin: 181.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e are provided. The Neural Net tutorial explains Neural Net processing for Digit Recognition. The neural net training method uses 784 input nodes,  20 convolutions(9x9), ReLU, Pooling, batch sampling, single hidden layer of 100 nodes, updating parameters via backwards propagation, and updating convolution kernels. The digit prediction accuracy is \u0026gt;94% after 50s of training. The final feature kernels are very amorphous and unexpected.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function mValidConv2=create_ValidConv2(m,K)\r\n  mValidConv2=conv2(m,K,'same');\r\nend\r\n\r\n% Code from Convolutional Neural Network in Matlab by Nuruzzaman Faruqui\r\n% Youtube:  https://www.youtube.com/watch?v=ZOXOwYUVCqw\r\n% I have made comments noted by raz and a couple speed enhancements\r\n% I also provide alternate direct source for MNIST files as .mat files\r\n%{\r\nfunction MNIST_Process\r\n%Based upon https://www.youtube.com/watch?v=ZOXOwYUVCqw\r\n%784 input nodes;20 conv 9x9 filters,ReLU;2x2 submatrix Pooling layer,single hidden layer 100 nodes\r\n\r\n%Matlab Convolutional Neural Network in Matlab\r\n%Processing MNIST digits using conv, contents, \r\n%MNIST files  http://yann.lecun.com/exdb/mnist/\r\n%Create filters\r\n%File Exchange NN https://www.mathworks.com/matlabcentral/fileexchange/59223-convolution-neural-network-simple-code-simple-to-use?s_tid=ta_fx_results\r\n%\r\n%use Test_images.mat if avail, use MNIST ubyte files if avail, load Test_images.mat\r\ndir_struct=dir;\r\nfilenames={dir_struct.name};\r\nfn='Test_images.mat';\r\nptr=find(ismember(filenames,fn));\r\nif ~isempty(ptr) % Test images/labels mat files exist\r\n tic;\r\n load('Test_images'); % images [28,28,10000] uint8\r\n load('Test_labels'); % labels [10000,1] uint8 values 0:9\r\n fprintf('Images:%i  Time:%.2f\\n',size(images,3),toc);\r\n Images=double(images)/255; %raz values must be 0:1 or bad things happen\r\n Labels=double(labels);\r\n Labels(Labels==0)=10; % 0 remapped to 10\r\n\r\nelse % Check for Mnist file\r\n %MNIST files source  http://yann.lecun.com/exdb/mnist/\r\n fn='t10k-images.idx3-ubyte'; %NMIST gzip expanded file for Test Images 10K\r\n filenames={dir_struct.name};\r\n ptr=find(ismember(filenames,fn));\r\n if ~isempty(ptr)\r\n  tic\r\n  Images=loadMNISTImages(fn);\r\n  fprintf('MNIST Images Process Time: %.2f\\n',toc); %raz\r\n  Images=reshape(Images,28,28,[]); % Un-vectorize the images\r\n  %Images already scaled by 1/255 in loadMNISTImages\r\n \r\n  Labels=loadMNISTLabels('t10k-labels.idx1-ubyte');\r\n  Labels(Labels==0)=10; % 0 to 10\r\nelse % download Test_images.mat, Test_labels.mat and load\r\n fnameTestI='Test_images.mat'; %load('Test_images.mat') creates images(28,28,10000) 1.6MB\r\n fnameTrainI='Train_images.mat'; %load('Train_images.mat') creates images(28,28,60000)  9.9MB\r\n fnameTestL='Test_labels.mat'; %load('Test_images.mat') creates labels(10000,1) 5KB\r\n fnameTrainL='Train_labels.mat'; %load('Train_images.mat') creates labels(60000,1) 30KB\r\n \r\n %Google Drive Dowloads need to come from shared files\r\n% Tweak link: file/d/ to uc?export=download\u0026id=   while removing /view?usp=sharing\r\n% https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=sharing\r\n% https://drive.google.com/uc?export=download\u0026id=1v3GsGgP3p905wzdvUqypL_-djYmxiyzK\r\n \r\n\r\n  urlTeI='https://drive.google.com/uc?export=download\u0026id=10ReGWlfSvr9p6uq6FQlqw6vw3UXgWo57';\r\n  urlTeL='https://drive.google.com/uc?export=download\u0026id=105zTcVgItZ2JjFiUkJulU33R7lXNl29-';\r\n  urlTrI='https://drive.google.com/uc?export=download\u0026id=1HJZssH6_9OcQ8mXwS_DtvsS_Kk86BDFY';\r\n  urlTrL='https://drive.google.com/uc?export=download\u0026id=1KNTn2eNXbQkQJNe6xhO1LMmvkDRP-XLq';\r\n \r\n  tic\r\n  urlwrite(urlTeI,fnameTestI); %Writing GoogleDrive MNIST_Test_images.pdf  Test_images.mat \r\n  fprintf('Download 1.6MB Time: %.1f  sec\\n\\n',toc); %1.6MB download Time, about 1.1 sec\r\n \r\n  tic\r\n  urlwrite(urlTeL,fnameTestL); %Writing GoogleDrive MNIST_Test_labels.pdf  Test_labels.mat\r\n  fprintf('Download 5KB Time: %.1f  sec\\n\\n',toc); %5KB download Time, about 0.5 sec\r\n \r\n  tic\r\n  urlwrite(urlTrI,fnameTrainI); %Writing GoogleDrive MNIST_Train_images.pdf  Train_images.mat\r\n  fprintf('Download 9.9MB Time: %.1f  sec\\n\\n',toc); %9.9MB download Time, about 4.1 sec\r\n \r\n  tic\r\n  urlwrite(urlTrL,fnameTrainL); %Writing GoogleDrive MNIST_Train_labels.pdf  Train_labels.mat\r\n  fprintf('Download 30KB Time: %.1f  sec\\n\\n',toc); %30KB download Time, about 0.6 sec\r\n\r\n  tic\r\n  load('Test_images'); % images [28,28,10000] uint8\r\n  load('Test_labels'); % labels [10000,1] uint8 values 0:9\r\n  fprintf('Images:%i  Time:%.2f\\n',size(images,3),toc); %.05s\r\n  Images=double(images)/255; %raz values must be 0:1 or bad things happen\r\n  Labels=double(labels);\r\n  Labels(Labels==0)=10; % 0 to 10\r\n end % if MNIST ubyte files\r\n\r\nend % if Test_images.mat\r\n\r\n\r\nrng(1); %raz not liked by curretn matlab\r\n\r\nW1=.01*randn([9 9 20]); %Conv Kernels   base .01\r\nW5=(2*rand(100,2000)-1)*sqrt(6)/sqrt(360+2000); %Hidden layer coeff of 100 pooled\r\nWo=(2*rand(10, 100)-1)*sqrt(6)/sqrt( 10+ 100); %Output coeff to find 0:9 best match\r\n\r\nX=Images(:,:,1:8000);\r\nD=Labels(1:8000);\r\nztic=tic;\r\nfor epoch=1:3  %Repeat cycles of all Training data\r\n fprintf('epoch:%i  Time:%.2f\\n',epoch,toc(ztic));\r\n [W1, W5, Wo]=MnistConv(W1,W5,Wo,X,D);\r\nend %epoch\r\n\r\n%save('MnistConv.mat'); % Used for Post analysis, see video\r\n\r\nX=Images(:,:,8001:10000);\r\nD=Labels(8001:10000);\r\nacc=0;\r\nN=length(D);\r\n\r\nfor k=1:N\r\n x=X(:,:,k);\r\n y1=Conv(x,W1); %Neural Net Processing  W1 kernels on image-x\r\n y2=ReLU(y1);   %Rectification process\r\n y3=Pool(y2);   %Take 20x20 conv images into 100 values\r\n y4=reshape(y3,[],1);\r\n v5=W5*y4;      %Hidden layer weights\r\n y5=ReLU(v5);   %Rectification process\r\n v=Wo*y5;       %Wo Output weight processing\r\n y=Softmax(v);  %create vector length 10 of expected probability, uses exp(x) smoothing\r\n                %Needed in training but not sure why in evaluation\r\n \r\n [~,i]=max(y);\r\n if i==D(k)\r\n  acc=acc+1;\r\n end\r\nend %k\r\n\r\n acc=acc/N;\r\n fprintf('Accuracy is %.2f%%  Time:%.2f\\n',100*acc,toc(ztic));  %raz output/time\r\n\r\nend% MNIST_Process\r\n\r\nfunction [W1, W5,Wo]=MnistConv(W1, W5,Wo,X,D)\r\n alpha=.01;\r\n beta=0.95;\r\n z=reshape(1:100,10,10); % raz\r\n kmap=kron(z,ones(2)); % raz\r\n \r\n momentum1=zeros(size(W1));\r\n momentum5=zeros(size(W5));\r\n momentumo=zeros(size(Wo));\r\n \r\n N=length(D);\r\n \r\n bsize=100;\r\n blist=1:bsize:(N-bsize+1);\r\n \r\n for batch=1:length(blist) % Batch/Updates, each Batch creates updates to Params\r\n  dW1=zeros(size(W1));\r\n  dW5=zeros(size(W5));\r\n  dWo=zeros(size(Wo));\r\n  \r\n  begin=blist(batch);\r\n  for k=begin:begin+bsize-1  %Subset Group of Training samples for param adjust\r\n   x=X(:,:,k);\r\n   y1=Conv(x,W1); %8K/5.8s  3.5s\r\n   y2=ReLU(y1);\r\n   y3=Pool(y2);\r\n   y4=reshape(y3,[],1);\r\n   v5=W5*y4;\r\n   y5=ReLU(v5);\r\n   v=Wo*y5;\r\n   y=Softmax(v); %10 Probability Bins for [1-9 0] \r\n   \r\n   d=zeros(10,1);\r\n   d(sub2ind(size(d),D(k),1))=1;\r\n   \r\n    e=d-y; % raz should this be (e-y)^2*sign(e-y)?\r\n    delta=e;\r\n    e5=Wo'*delta;\r\n    delta5=(y5\u003e0).*e5;\r\n    e4=W5'*delta5;\r\n    e3=reshape(e4,size(y3));\r\n    e2=zeros(size(y2));\r\n    W3=ones(size(y2))/(2*2);\r\n    \r\n    for c=1:20\r\n     %e2(:,:,c)=kron(e3(:,:,c),ones([2 2])).*W3(:,:,c); %160K/4.5s\r\n     e3c=e3(:,:,c); %160K/.27 raz\r\n     e2(:,:,c)=e3c(kmap).*W3(:,:,c);  %160K/.8s  raz\r\n    end %c\r\n    \r\n    delta2=(y2\u003e0).*e2;\r\n    delta1_x=zeros(size(W1)); \r\n    \r\n    for c=1:20\r\n     delta1_x(:,:,c)=conv2(x(:,:),rot90(delta2(:,:,c),2),'valid'); %160K/5.3s\r\n    end %c\r\n    \r\n    dW1=dW1+delta1_x; %error per kernel plane\r\n    dW5=dW5+delta5*y4'; %8K/4.2s  100x2000\r\n    dWo=dWo+delta*y5';\r\n  end %k\r\n  dW1=dW1/bsize;\r\n  dW5=dW5/bsize;\r\n  dWo=dWo/bsize;\r\n  \r\n  momentum1=alpha*dW1+beta*momentum1;\r\n  W1       = W1+momentum1;\r\n  \r\n  momentum5=alpha*dW5+beta*momentum5;\r\n  W5       = W5+momentum5;\r\n  \r\n  momentumo=alpha*dWo+beta*momentumo;\r\n  Wo       = Wo+momentumo;\r\n  \r\n end % batch\r\n \r\nend %MnistConv\r\n\r\nfunction rng(x)\r\n randn('seed',x);\r\n rand('seed',x);\r\nend % rng\r\n\r\nfunction y=Pool(x)\r\n [xrow,xcol,numFilters]=size(x);\r\n y=zeros(xrow/2,xcol/2,numFilters);\r\n for k=1:numFilters\r\n  filter=ones(2)/(2*2);\r\n  image=conv2(x(:,:,k),filter,'valid');\r\n  y(:,:,k)=image(1:2:end,1:2:end);\r\n end\r\n\r\nend %Pool\r\n\r\nfunction y=Conv(x,W)\r\n [wrow,wcol,numFilters]=size(W);\r\n [xrow,xcol,~         ]=size(x);\r\n \r\n yrow=xrow-wrow+1;\r\n ycol=xcol-wcol+1;\r\n \r\n y=zeros(yrow,ycol,numFilters);\r\n \r\n for k=1:numFilters\r\n  filter=W(:,:,k);\r\n  filter=rot90(squeeze(filter),2); %200K/2.5s  raz remove test/92.15%\r\n  y(:,:,k)=conv2(x,filter,'valid'); %200K/3.7s  3.5s\r\n end\r\nend %Conv\r\n\r\nfunction y=Softmax(x)\r\n ex=exp(x);\r\n y=ex/sum(ex);\r\nend %Softmax\r\n\r\nfunction y=ReLU(x)\r\n y=max(0,x);\r\nend %ReLU\r\n\r\n\r\n\r\nfunction images=loadMNISTImages(filename)\r\n%\r\nfp=fopen(filename,'rb');\r\nassert(fp~=-1,['Could not open', filename,'']);\r\nmagic=fread(fp,1,'int32',0,'ieee-be');\r\nassert(magic==2051,['Bad magic number in', filename, '']); %2051 Images\r\nnumImages=fread(fp,1,'int32',0,'ieee-be');\r\nnumRows=fread(fp,1,'int32',0,'ieee-be');\r\nnumCols=fread(fp,1,'int32',0,'ieee-be');\r\nimages=fread(fp,inf,'unsigned char=\u003eunsigned char');\r\nfclose(fp);\r\nfprintf('Images:%i  rows:%i  cols:%i\\n',numImages,numRows,numCols); %raz\r\n\r\nimages=reshape(images,numCols,numRows,numImages);\r\nimages=permute(images,[2 1 3]); \r\n\r\nimages=reshape(images,size(images,1)*size(images,2),size(images,3)); %raz Will be reverted\r\nimages=double(images)/255;\r\n \r\nend %loadMNISTImages\r\n\r\nfunction labels=loadMNISTLabels(filename)\r\n%\r\nfp=fopen(filename,'rb');\r\nassert(fp~=-1,['Could not open', filename,'']);\r\nmagic=fread(fp,1,'int32',0,'ieee-be');\r\nassert(magic==2049,['Bad magic number in ', filename,'']);\r\nnumLabels=fread(fp,1,'int32',0,'ieee-be');\r\nlabels=fread(fp,inf,'unsigned char');\r\nassert(size(labels,1)==numLabels,'Mismatch in label count');\r\nfclose(fp);\r\nfprintf('Labels:%i\\n',numLabels); %raz\r\n\r\n\r\nend %loadMNISTLabels\r\n%}","test_suite":"%%\r\n%Google Drive Dowloads need to come from shared files\r\n% Tweak link: file/d/ to uc?export=download\u0026id=   while removing /view?usp=sharing\r\n% https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=sharing\r\n% https://drive.google.com/uc?export=download\u0026id=1v3GsGgP3p905wzdvUqypL_-djYmxiyzK\r\n fnameTestI='Test_images.mat'; %load('Test_images.mat') creates images(28,28,10000) 1.6MB\r\n fnameTrainI='Train_images.mat'; %load('Train_images.mat') creates images(28,28,60000)  9.9MB\r\n fnameTestL='Test_labels.mat'; %load('Test_images.mat') creates labels(10000,1) 5KB\r\n fnameTrainL='Train_labels.mat'; %load('Train_images.mat') creates labels(60000,1) 30KB\r\n \r\n urlTeI='https://drive.google.com/uc?export=download\u0026id=10ReGWlfSvr9p6uq6FQlqw6vw3UXgWo57';\r\n urlTeL='https://drive.google.com/uc?export=download\u0026id=105zTcVgItZ2JjFiUkJulU33R7lXNl29-';\r\n urlTrI='https://drive.google.com/uc?export=download\u0026id=1HJZssH6_9OcQ8mXwS_DtvsS_Kk86BDFY';\r\n urlTrL='https://drive.google.com/uc?export=download\u0026id=1KNTn2eNXbQkQJNe6xhO1LMmvkDRP-XLq';\r\n \r\n % fn.mat  https://drive.google.com/file/d/10GsOZTIjzMIuO7xAYIqLT1zIq9Cyubl-/view?usp=drive_link\r\n % Google Gives warning thus aborts urlwrite\r\n %\r\n %fname='Mnist_Test_images.pdf'\r\n %Fake name of .pdf on GoogleDrive,  write as a mat\r\n \r\n %url='https://drive.google.com/file/d/1mgxzsmVQNXgqHEdd61QR2r0STm3N9lgG/view?usp=drive_link';\r\n %ptr=strfind(url,'/view'); % Tweaking the url\r\n %url(ptr:end)=[];\r\n %url=strrep(url,'file/d/','uc?export=download\u0026id=');\r\n \r\n tic\r\n urlwrite(urlTeI,fnameTestI); %Writing GoogleDrive MNIST_Test_images.pdf  Test_images.mat\r\n fprintf('Download 1.6MB Time: %.1f  sec\\n',toc); %1.6MB download Time, about 1.5 sec\r\n \r\n tic\r\n urlwrite(urlTeL,fnameTestL); %Writing GoogleDrive MNIST_Test_labels.pdf  Test_labels.mat\r\n fprintf('Download 5KB Time: %.1f  sec\\n',toc); %5KB download Time, about .5 sec\r\n \r\n global labels images \r\n \r\n load('Test_images'); % images [28,28,10000] uint8\r\n load('Test_labels'); % labels [10000,1] uint8 values 0:9\r\n \r\n %Showing a Label and an image from Mnist\r\n ptr=randi(10000);\r\n fprintf('Label:%i\\n',labels(ptr));\r\n figure(1);imagesc(images(:,:,ptr)); colormap gray;\r\n \r\n \r\nvalid=1;\r\nassert(valid)\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n ptr=randi(10000);\r\n fprintf('Label:%i\\n',labels(ptr));\r\n m=double(images(:,:,ptr))/255;\r\n figure(2);imagesc(m); colormap gray;\r\n \r\n K=repmat([0 0 .5 1 1 1 .5 0 0],9,1); % Vert Bar\r\n mValidConv2=create_ValidConv2(m,K);\r\n figure(3);imagesc(mValidConv2); colormap gray;\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(5:end-4,5:end-4),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n ptr=randi(10000);\r\n fprintf('Label:%i\\n',labels(ptr));\r\n m=double(images(:,:,ptr))/255;\r\n figure(2);imagesc(m); colormap gray;\r\n \r\n K=repmat([0 0 .5 1 1 1 .5 0 0]',1,9); %Horiz Bar\r\n mValidConv2=create_ValidConv2(m,K);\r\n figure(3);imagesc(mValidConv2); colormap gray;\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(5:end-4,5:end-4),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n m=rand(24);\r\n K=repmat([0 .5 1 1 1 .5 0]',1,7); %Horiz Bar\r\n mValidConv2=create_ValidConv2(m,K)\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(4:end-3,4:end-3),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n m=rand(8);\r\n K=ones(3)/9;\r\n mValidConv2=create_ValidConv2(m,K)\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(2:end-1,2:end-1),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":0,"created_by":3097,"edited_by":3097,"edited_at":"2023-08-17T19:33:19.000Z","deleted_by":null,"deleted_at":null,"solvers_count":13,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-08-17T14:03:38.000Z","updated_at":"2025-12-09T23:45:29.000Z","published_at":"2023-08-17T19:33:20.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\u003eThis challenge is to return only the Valid portion of a 2-D convolution. Valid is deemed to be where all elements of the kernel are applied against the image. The (1,1) point with a ones(3) kernel would be invalid while point (2,2) would return a Valid convolution value. The images will be even-square,m, and the kernels will be odd-square,K.The m=ones(6) and K=ones(3) would return a 4x4 matrix of 9s.\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\u003emValidConv2=create_ValidConv2(m,K)\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\u003eIn neural net processing of the Mnist database of digits(0-9) one Convolutional Neural Network method uses 9x9 kernels on the 28x28 images to return the Valid 20x20 central core for the next processing step. The third image includes a black border of four around Valid to maintain scale.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"189\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"252\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"189\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"252\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId2\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"189\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"252\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId3\\\"/\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\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe entire Matlab code from \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.youtube.com/watch?v=ZOXOwYUVCqw\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eConvolutional Neural Networks in Matlab by Nuruzzaman Faruqui\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e , a Matlab Neural Net Tutorial for Mnist processing, is included in the function template. Loading the Mnist Train/Test Images/Labels from posted MAT files or \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eTHE MNIST DATABASE of handwritten digits\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e are provided. The Neural Net tutorial explains Neural Net processing for Digit Recognition. The neural net training method uses 784 input nodes,  20 convolutions(9x9), ReLU, Pooling, batch sampling, single hidden layer of 100 nodes, updating parameters via backwards propagation, and updating convolution kernels. The digit prediction accuracy is \u0026gt;94% after 50s of training. The final feature kernels are very amorphous and unexpected.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image2.png\",\"relationshipId\":\"rId2\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image3.png\",\"relationshipId\":\"rId3\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\",\"relationship\":null},{\"partUri\":\"/media/image2.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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JMnSpUtT3FNQULB8+fKWlpaFCxfu2rVr8uTJqb+P6bvmbd+Z8frrr99www3z5s2bOHFi2luSJEmam5vfeOONK664ovuwsLDw008/TXHPoEGDWltba2pqkiTZunVrXV3diSeemOIvaWxpaVm7du3UqVO7D/fv35/uNffJJ5/89cO+ffumteTr6urqUn8zZI8dO3aUlZX1/M0MGTLko48+SnHPl19+uXv37kceeaT7cMaMGanfqP/Opf2uiuhWrVoV4V12W7ZsOeecc1auXLn/fxw8eDDdSY2NjeXl5R988EFXV1dra+u4ceP+9re/pTupx89//vPU32X3z3/+s+ctW9u2bRs3btzq1atT3LN///4xY8asXLmyq6vr888/Hz9+/BtvvJHinm5jx45dtWpV2iv+ZdOmTWeddVb3p/TOnTsvuuiiZ555JsU9W7duLS8v37ZtW1dX17p160aPHr1z584U9xwGrpCyoaamZvfu3dddd13Pn1RVVd15550pTiopKbn99tunTJkycuTIdevWzZgx48ILL0xxTzRlZWWzZ8+urKw866yzNm7cOHPmzHRftz/mmGMefvjhm266adGiRU1NTVdffXXq3xvb2dnZ3t4e5NXQJEnKy8tvu+22adOmDR8+/N133506deqUKVNS3FNUVHTzzTdPmjSpvLx869atDz30UOrfWP1d842x5KSzs7Otre3kk08Ocgsoms7Ozr179x533HFx3iPz1VdfHXvssf69vk33P1l+fn6Qv6KOjo59+/YFebvvd02QAAghyv+1AXCUEyQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABC+G8Tb/bPfPYYhwAAAABJRU5ErkJggg==\",\"relationship\":null},{\"partUri\":\"/media/image3.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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PcuyxsbGQ4cONTY2Zlk2f/785ubmjo6OSu8RgAnJQZAuXbq0devW3bt3b9myZeyZ3t7ekydPlhY8fPiwpiYHJwLAj6n0Ldp/8a9//eu11147e/bsw//16NGja9euvfLKK93d3aOjo/39/atXr75w4cKTf9ZbdgAl8d+yi/57SMeOHfvuu++2bdtWeqalpeXTTz9tbW3dtGnTihUrLl++vGPHDr+EBJB3efopu1RNTU1+uA5gTKFQCP5Tdj56ASAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEHKjUKhUOktPCNT5EynyGlmU+ZMp8hplpUgARCCIAEQwrTR0dFK76FcmpqaKr0FgEC6uroqvYUfU81BAiBHvGUHQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIz1V6A/x3g4OD169fLz0sFAqzZ8+u4H7K5OLFi2vWrCk97Ovru3bt2ssvv1x9Eze+f6ZVeXF7enp6e3sbGhpef/310pNVeUGfPNOqvKDPjCDlwKlTp/bv319bWzv28ODBg9//xl0dDh8+fPz48YsXL449PH36dFtb2+rVqzs6Ot5///0PP/ywstubRD840+q7uHv27Dl37tzKlSu7urrq6uqOHj1aW1tblRf0qWdafRf0mRolvI8++uiLL76o9C7KZWho6OOPP37ttdfeeuutsWcePXr02muvdXd3j46O3rlz55e//OU///nPiu5xcjx5pqNVd3GvXLny6quvDg0NjT1ct27dl19+WZUX9KlnOlp1F/QZ8xlSDly9enXJkiWDg4PDw8OV3svkO3DgQENDw2effVZ65sKFC/X19cuWLcuyrKGhYe3ate3t7ZXb4KR58kyzqru49fX1R44cmTNnztjDxYsX37p1qyov6FPPNKu6C/qMecsuupGRkRs3buzZs2doaKhYLG7cuHHv3r2V3tRk2rVrV01Nzfnz50vPFIvF5cuXlx7OmjUr+IjicXryTKvv4i5atGjRokVjX/f29p49e3bbtm1dXV3Vd0GfeqbVd0GfMXdI0fX39zc3Nx85cuTrr7/+6quvLly4cPz48UpvajLV1PzwL+HIyMi0adNKD6dPnz5aFTPpnzzTKr64AwMDH3zwwfbt21955ZVqvaBjvn+mVXxBnw1Biq6xsfHQoUONjY1Zls2fP7+5ubmjo6PSmyqvGTNmPH78uPRwZGRk+vTpFdxP+VTrxf3mm282bNiwefPm7du3Z1V9QX9wptV6QZ8ZQYqut7f35MmTpYcPHz588h/aVeaFF17o7OwsPSwWiytXrqzgfsqnKi/upUuXtm7dunv37i1btow9U60X9MkzrcoL+ix5saJ78ODBrl27enp6siwbGBg4e/bs+vXrK72p8nrjjTeyLBv7rKWnp6e9vX3VqlWV3lRZVN/F7evr27Fjx+eff/7OO+8MDw8PDw+PjIxU5QV96plW3wV9xvxQQ3RNTU2tra2bNm1asWLF5cuXd+zYUfW/1lBTU7Nv376dO3cuXbq0s7Ozra1t3rx5ld5UWVTfxT127Nh33323bdu20jMtLS2ffvpp9V3Q/+tMq+yCPmP+F+b58Pjx4/v378+cOXNKvQPw73//eyqc8tS5uC4oP06QAAhBwAEIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAI4X8AiB24LVwZWacAAAAASUVORK5CYII=\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":42793,"title":"Fast 1-D Convolution (full shape)","description":"This is the first problem in the \u003chttp://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution fast 1-D convolution series\u003e. This problem asks you to find a fast algorithm to compute the 1-D convolution in its full output shape.  \r\n\r\nThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in *conv* function invoked in the form *conv(u,v,'full')*, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out. \r\n\r\n* Next problem: \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape Fast 1-D Convolution (same shape)\u003e.","description_html":"\u003cp\u003eThis is the first problem in the \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\"\u003efast 1-D convolution series\u003c/a\u003e. This problem asks you to find a fast algorithm to compute the 1-D convolution in its full output shape.\u003c/p\u003e\u003cp\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in \u003cb\u003econv\u003c/b\u003e function invoked in the form \u003cb\u003econv(u,v,'full')\u003c/b\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\u003c/p\u003e\u003cul\u003e\u003cli\u003eNext problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\"\u003eFast 1-D Convolution (same shape)\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e","function_template":"function y = fconv1f(u,v)\r\n  y = conv(u,v,'full');   % Extremely inefficient solution!\r\nend","test_suite":"%%\r\n%{\r\n╔═════════════════════════════════════════════════════════════╗\r\n║ Please note that problems in this series are designed for   ║\r\n║ optimizing the code performance, rather than the usual Cody ║\r\n║ \"size\". We are achieving this goal by courtesy of LY Cao's  ║ \r\n║ new scoring function, which automatically grants a better   ║\r\n║ score to a faster solution. Kindly note that simply using   ║\r\n║ the conv function may result in a poor score or even failure║\r\n║ in one of the tests. Suggestions and comments are welcome.  ║\r\n║                                                             ║\r\n║ Thanks \u0026 have fun!                                          ║\r\n║ Peng                                                        ║\r\n╚═════════════════════════════════════════════════════════════╝\r\n%}\r\n\r\n%%\r\nfid = fopen('EvaluateSolution.p','wb'); \r\nfwrite(fid,uint8(sscanf('7630312E30307630302E30300005B01CF7473FB1000000B50000010D000001A93014D309F9979F2A2C808C4F104ACA1480D0378FBCF4FF1C4C94A38C84A4969D0A597F5F12C8D564E7CD9584DF8BDD849A3B8C5FDEB66A3837A064275728B38736860BB79ABC4B3091D37C9A2010BE0378E708E59716738F85AA4AEBC8982C45E6CD45BAD19BD043D16D5834122D405752633CE6BD78ABA0676336E7BCDD4F2E181FF1CE8E9165F6BF30D850ED74385A40BDEB73AD82518B4CF2BB034951B1D23D360EDF335C22C209AAB3857BCEF61D192170FDE9D5449721A6B6DD082257E430059753696F1C5CD66E6B09AD24270B0335E830203EACA5BDF3E2A57620D5DB44A96AFCDE0387EF112F2A83FBF90E4AF09F9D4FCAA22134055610D0F7B55568D50A52CD5C46A3F0CA655C1B68','%2x')));\r\nfclose(fid);\r\n\r\n%%\r\nu = 1; v = 1;\r\ny_correct = 1;\r\nassert(isequal(fconv1f(u,v),y_correct))\r\n\r\n%%\r\nu = 1:10; v = 1:5;\r\ny_correct = [1,4,10,20,35,50,65,80,95,110,114,106,85,50];\r\nassert(all(abs(fconv1f(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = [2 -4 0 1].'; v = [1:5].';\r\ny_correct = [2,0,-2,-3,-4,-17,4,5].';\r\nassert(all(abs(fconv1f(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(20,1); v = rand(10,1);\r\ny_correct = conv(u,v,'full');\r\nassert(all(abs(fconv1f(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\n% Large data size\r\nglobal sol_score\r\nu = rand(8e5,1); v = rand(1e5,1);\r\nt = builtin('tic');\r\ny = fconv1f(u,v);\r\nsol_score = 50*builtin('toc',t);\r\nAbsTol = 1e-6;   % Maximum absolute error tolerance\r\npass = EvaluateSolution(u,v,y,AbsTol);  \r\nassert(pass);\r\n\r\n%%\r\n% New scoring function by LY Cao\r\nglobal sol_score\r\nfid = fopen('score.p','wb');\r\nfwrite(fid,sscanf('7630312E30307630302E30300008501CD77E9FB100000035000001110000018422762999A8C1DE50537BEE443F4D73651F830FC6C78ADFB7DF68DF98823F565884DC58E21C7E397E3D26E4FFEA9A0D83589ABB5C0B0B553B44CFD79C9B272D11DF1965AD538598E8319529727DF4C4CF36A6016DD7816544AE5A8F64C9B2D9D0C4B94DD5EDF14595CBFE3D402647499EA3D9D125AC927454ED85973BCD1AAEA536D5A6CDDCD78A0211E8179603FFE12E4AB0E4704EA195704428700BAE5C4DFD42FF1A8760EDF2721F9724498ECC9F957735E7A3CDB9630DB17DF92ACE8F486706020E0A8D022D14BC313879724760AE20D67F572DD85211E4BEA45CDF3E22976253F113AEA96C1FF907329E4BD429BCFC6331077DA21F05D791DA6ECCF680D2E23AC77DFCE5C1D9869D3098F5B89FF92A','%2x'));\r\nfclose(fid);\r\nscore(sol_score);\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":6,"created_by":12569,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":34,"test_suite_updated_at":"2016-04-04T03:53:09.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2016-04-02T21:05:59.000Z","updated_at":"2025-12-09T13:00:47.000Z","published_at":"2016-04-03T19:56: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\u003eThis is the first problem in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efast 1-D convolution series\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. This problem asks you to find a fast algorithm to compute the 1-D convolution in its full output shape.\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\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e function invoked in the form\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv(u,v,'full')\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\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\u003eNext problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (same shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\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":42795,"title":" Fast 1-D Convolution (valid shape) ","description":"Pursuant to the first problem in the \u003chttp://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution fast 1-D convolution series\u003e, this problem asks for the fast algorithm to compute the 1-D convolution in its \"valid\" output shape.  \r\n\r\nThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in *conv* function invoked in the form *conv(u,v,'valid')*, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out. \r\n\r\n* Previous problem: \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape Fast 1-D Convolution (same shape)\u003e.","description_html":"\u003cp\u003ePursuant to the first problem in the \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\"\u003efast 1-D convolution series\u003c/a\u003e, this problem asks for the fast algorithm to compute the 1-D convolution in its \"valid\" output shape.\u003c/p\u003e\u003cp\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in \u003cb\u003econv\u003c/b\u003e function invoked in the form \u003cb\u003econv(u,v,'valid')\u003c/b\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\u003c/p\u003e\u003cul\u003e\u003cli\u003ePrevious problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\"\u003eFast 1-D Convolution (same shape)\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e","function_template":"function w = fconv1v(u,v)\r\n  % Extremely inefficient solution not guaranteed to pass all tests :-(\r\n  w = conv(u,v,'valid'); \r\nend","test_suite":"%%\r\n%{\r\n╔═════════════════════════════════════════════════════════════╗\r\n║ Please note that problems in this series are designed for   ║\r\n║ optimizing the code performance, rather than the usual Cody ║\r\n║ \"size\". We are achieving this goal by courtesy of LY Cao's  ║ \r\n║ new scoring function, which automatically grants a better   ║\r\n║ score to a faster solution. Kindly note that simply using   ║\r\n║ the conv function may result in a poor score or even failure║\r\n║ in one of the tests. Suggestions and comments are welcome.  ║\r\n║                                                             ║\r\n║ Thanks \u0026 have fun!                                          ║\r\n║ Peng                                                        ║\r\n╚═════════════════════════════════════════════════════════════╝\r\n%}\r\n\r\n%%\r\nfid = fopen('EvaluateSolution.p','wb'); \r\nfwrite(fid,uint8(sscanf('7630312E30307630302E3030000CF01CCC561FB1000000C30000012D000001D160E44E2EC6DB5CE66B30F9B560AF40D6A7226365293F6413AE84ABD44D4C7EE5C617DCDAC2521B24B2951C23F50BA9DAA4179B35DCED27A697FC9CA9A308698729973CACEC16670C077236F96E9D16612152B0C32FC57E4755E80E40AC876804B7835D9703BC5A1D6FC519FDEDE22237DC59455FF0014FEBCEF1CB2A840158E11CDD5D6C78D594F50B575A4DF9FB54705F2C6D40341F12CE207B892CBEDEC018A1F94CFA1D5FBB9E1912BA424CD5C6C422D6F3451A8BDD2543834B3FFAD3107D8F16C78D75DD9F3AD197D5591B1686E190D8DF4B5EF3AC28C641296E92FB02BC395D442C03480E156E48F8B61AA3C6F1526AA95C1C466C77A3803AF8523098B0A3ED10A07E2F93274DC8207B05A572988754AAC211A330C2FEC7928CFD51D3A6FBDD9FFA6036C948E0C4239A16','%2x')));\r\nfclose(fid);\r\n\r\n%%\r\nu = 1; v = 1;\r\ny_correct = 1;\r\nassert(isequal(fconv1v(u,v),y_correct))\r\n\r\n%%\r\nu = 1:10; v = 1:5;\r\ny_correct = conv(u,v,'valid');\r\nassert(all(abs(fconv1v(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = 1:5; v = 1:10;\r\ny_correct = zeros(1,0);\r\nassert(isequal(fconv1v(u,v),y_correct))\r\n\r\n%%\r\nu = rand(20,1); v = rand(10,1);\r\ny_correct = conv(u,v,'valid');\r\nassert(all(abs(fconv1v(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(10,1); v = rand(20,1);\r\ny_correct = zeros(0,1);\r\nassert(isequal(fconv1v(u,v),y_correct))\r\n\r\n%%\r\n% Large data size\r\nglobal sol_score\r\nAbsTol = 1e-6;   % Maximum absolute error tolerance\r\nuu = rand(5e6,15); vv = rand(2e5,15);\r\nfor iter = 15:-1:1\r\n    u = uu(:,iter); v = vv(:,iter);\r\n    t = builtin('tic');\r\n    y = fconv1v(u,v);\r\n    timeSpan(iter) = builtin('toc',t);\r\n    pass(iter) = EvaluateSolution(u,v,y,AbsTol);  \r\nend\r\nsol_score = sum(timeSpan);\r\nassert(all(pass));\r\n\r\n%%\r\n% New scoring function by LY Cao\r\nglobal sol_score\r\nfid = fopen('score.p','wb');\r\nfwrite(fid,sscanf('7630312E30307630302E30300008501CD77E9FB100000035000001110000018422762999A8C1DE50537BEE443F4D73651F830FC6C78ADFB7DF68DF98823F565884DC58E21C7E397E3D26E4FFEA9A0D83589ABB5C0B0B553B44CFD79C9B272D11DF1965AD538598E8319529727DF4C4CF36A6016DD7816544AE5A8F64C9B2D9D0C4B94DD5EDF14595CBFE3D402647499EA3D9D125AC927454ED85973BCD1AAEA536D5A6CDDCD78A0211E8179603FFE12E4AB0E4704EA195704428700BAE5C4DFD42FF1A8760EDF2721F9724498ECC9F957735E7A3CDB9630DB17DF92ACE8F486706020E0A8D022D14BC313879724760AE20D67F572DD85211E4BEA45CDF3E22976253F113AEA96C1FF907329E4BD429BCFC6331077DA21F05D791DA6ECCF680D2E23AC77DFCE5C1D9869D3098F5B89FF92A','%2x'));\r\nfclose(fid);\r\nscore(sol_score);","published":true,"deleted":false,"likes_count":2,"comments_count":1,"created_by":12569,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":17,"test_suite_updated_at":"2016-04-05T21:09:16.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2016-04-02T21:30:34.000Z","updated_at":"2025-12-21T14:08:51.000Z","published_at":"2016-04-04T01:47: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\":[],\"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\u003ePursuant to the first problem in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efast 1-D convolution series\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, this problem asks for the fast algorithm to compute the 1-D convolution in its \\\"valid\\\" output shape.\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\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e function invoked in the form\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv(u,v,'valid')\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\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\u003ePrevious problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (same shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\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":42794,"title":" Fast 1-D Convolution (same shape) ","description":"Pursuant to the first problem in the \u003chttp://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution fast 1-D convolution series\u003e, this problem asks for the fast algorithm to compute the 1-D convolution with the same input-output shape.  \r\n\r\nThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in *conv* function invoked in the form *conv(u,v,'same')*, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out. \r\n\r\n* Previous problem:  \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42793-fast-1-d-convolution-full-shape Fast 1-D Convolution (full shape)\u003e\r\n* Next problem: \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42795-fast-1-d-convolution-valid-shape Fast 1-D Convolution (valid shape)\u003e\r\n","description_html":"\u003cp\u003ePursuant to the first problem in the \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\"\u003efast 1-D convolution series\u003c/a\u003e, this problem asks for the fast algorithm to compute the 1-D convolution with the same input-output shape.\u003c/p\u003e\u003cp\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in \u003cb\u003econv\u003c/b\u003e function invoked in the form \u003cb\u003econv(u,v,'same')\u003c/b\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\u003c/p\u003e\u003cul\u003e\u003cli\u003ePrevious problem:  \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42793-fast-1-d-convolution-full-shape\"\u003eFast 1-D Convolution (full shape)\u003c/a\u003e\u003c/li\u003e\u003cli\u003eNext problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42795-fast-1-d-convolution-valid-shape\"\u003eFast 1-D Convolution (valid shape)\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e","function_template":"function y = fconv1s(u,v)\r\n  % Extremely inefficient solution not guaranteed to pass all tests :-(\r\n  y = conv(u,v,'same'); \r\nend","test_suite":"%%\r\n%{\r\n╔═════════════════════════════════════════════════════════════╗\r\n║ Please note that problems in this series are designed for   ║\r\n║ optimizing the code performance, rather than the usual Cody ║\r\n║ \"size\". We are achieving this goal by courtesy of LY Cao's  ║ \r\n║ new scoring function, which automatically grants a better   ║\r\n║ score to a faster solution. Kindly note that simply using   ║\r\n║ the conv function may result in a poor score or even failure║\r\n║ in one of the tests. Suggestions and comments are welcome.  ║\r\n║                                                             ║\r\n║ Thanks \u0026 have fun!                                          ║\r\n║ Peng                                                        ║\r\n╚═════════════════════════════════════════════════════════════╝\r\n%}\r\n\r\n%%\r\nfid = fopen('EvaluateSolution.p','wb'); \r\nfwrite(fid,uint8(sscanf('7630312E30307630302E3030000E201CC0225FB10000010B000001480000023C141D1F2F8C075F9CDC9AA9EE4F066DD1BE8B37851CBC980DC3CFCB6C55FAA40EAEED061766137EB39A214C865F6410AAF263010C3B9D012F499C4718371499BB689324D8892718476958CEAC4EE884BB215750071FA3AEE658AB639696B588AA35864A8AF99C9981E6AB14F1BE31F76F320D6F1EA110DE5A9E1C9F4597921FF711410412A4E9C4AA1026E997F054CBEF2A6FC2607C95B65D62747B293B8A86A0D33830E20CCB930D6986416727FFE5CB77FE03A0722EE2B47A07493392D53C4C7A0995EDFA31DB344F2C390E67574523D59403673E343AB6E1A5D83D0EE6B4E784AAA80184B8295937D1648E6A92E82360BE54C82D837FFBE28102BB1EF99FEB94473DB16240A68474D4E8DA84CD1B6DB5AA3FB2921D378C5D78A3A006E36169618AF0F4A18645472518E158E85BB81BC6CBEDCD7A861A67E1ECC712442F423199F4EB715F9493CA','%2x')));\r\nfclose(fid);\r\n\r\n%%\r\nu = 1; v = 1;\r\ny_correct = 1;\r\nassert(isequal(fconv1s(u,v),y_correct))\r\n\r\n%%\r\nu = 1:10; v = 1:5;\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = 1:5; v = 1:10;\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(20,1); v = rand(10,1);\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(10,1); v = rand(20,1);\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\n% Large data size\r\nglobal sol_score\r\nAbsTol = 1e-6;   % Maximum absolute error tolerance\r\nfor iter = 15:-1:1\r\n    u = rand(5e6,1); v = rand(2e5,1);\r\n    t = builtin('tic');\r\n    y = fconv1s(u,v);\r\n    timeSpan(iter) = builtin('toc',t);\r\n    pass(iter) = EvaluateSolution(u,v,y,AbsTol);  \r\nend\r\nsol_score = sum(timeSpan);\r\nassert(all(pass));\r\n\r\n%%\r\n% New scoring function by LY Cao\r\nglobal sol_score\r\nfid = fopen('score.p','wb');\r\nfwrite(fid,sscanf('7630312E30307630302E30300008501CD77E9FB100000035000001110000018422762999A8C1DE50537BEE443F4D73651F830FC6C78ADFB7DF68DF98823F565884DC58E21C7E397E3D26E4FFEA9A0D83589ABB5C0B0B553B44CFD79C9B272D11DF1965AD538598E8319529727DF4C4CF36A6016DD7816544AE5A8F64C9B2D9D0C4B94DD5EDF14595CBFE3D402647499EA3D9D125AC927454ED85973BCD1AAEA536D5A6CDDCD78A0211E8179603FFE12E4AB0E4704EA195704428700BAE5C4DFD42FF1A8760EDF2721F9724498ECC9F957735E7A3CDB9630DB17DF92ACE8F486706020E0A8D022D14BC313879724760AE20D67F572DD85211E4BEA45CDF3E22976253F113AEA96C1FF907329E4BD429BCFC6331077DA21F05D791DA6ECCF680D2E23AC77DFCE5C1D9869D3098F5B89FF92A','%2x'));\r\nfclose(fid);\r\nscore(sol_score);","published":true,"deleted":false,"likes_count":1,"comments_count":2,"created_by":12569,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":17,"test_suite_updated_at":"2016-04-05T20:53:23.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2016-04-02T21:30:23.000Z","updated_at":"2025-12-21T14:01:33.000Z","published_at":"2016-04-04T01:47:11.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\u003ePursuant to the first problem in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efast 1-D convolution series\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, this problem asks for the fast algorithm to compute the 1-D convolution with the same input-output shape.\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\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e function invoked in the form\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv(u,v,'same')\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\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\u003ePrevious problem: \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42793-fast-1-d-convolution-full-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (full shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\u003eNext problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42795-fast-1-d-convolution-valid-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (valid shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\"}]}"}],"problem_search":{"errors":[],"problems":[{"id":58877,"title":"Neural Net Image Convolution: Return only Valid portion of conv2","description":"This challenge is to return only the Valid portion of a 2-D convolution. Valid is deemed to be where all elements of the kernel are applied against the image. The (1,1) point with a ones(3) kernel would be invalid while point (2,2) would return a Valid convolution value. The images will be even-square,m, and the kernels will be odd-square,K.The m=ones(6) and K=ones(3) would return a 4x4 matrix of 9s.\r\nmValidConv2=create_ValidConv2(m,K)\r\nIn neural net processing of the Mnist database of digits(0-9) one Convolutional Neural Network method uses 9x9 kernels on the 28x28 images to return the Valid 20x20 central core for the next processing step. The third image includes a black border of four around Valid to maintain scale.\r\n  \r\nThe entire Matlab code from Convolutional Neural Networks in Matlab by Nuruzzaman Faruqui , a Matlab Neural Net Tutorial for Mnist processing, is included in the function template. Loading the Mnist Train/Test Images/Labels from posted MAT files or THE MNIST DATABASE of handwritten digits are provided. The Neural Net tutorial explains Neural Net processing for Digit Recognition. The neural net training method uses 784 input nodes,  20 convolutions(9x9), ReLU, Pooling, batch sampling, single hidden layer of 100 nodes, updating parameters via backwards propagation, and updating convolution kernels. The digit prediction accuracy is \u003e94% after 50s of training. The final feature kernels are very amorphous and unexpected.","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: 545.5px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 272.75px; transform-origin: 407px 272.75px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 84px; 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 42px; text-align: left; transform-origin: 384px 42px; 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: 369.5px 8px; transform-origin: 369.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis challenge is to return only the Valid portion of a 2-D convolution. Valid is deemed to be where all elements of the kernel are applied against the image. The (1,1) point with a ones(3) kernel would be invalid while point (2,2) would return a Valid convolution value. The images will be even-square,m, and the kernels will be odd-square,K.The m=ones(6) and K=ones(3) would return a 4x4 matrix of 9s.\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: 121.5px 8px; transform-origin: 121.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003emValidConv2=create_ValidConv2(m,K)\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 63px; 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 31.5px; text-align: left; transform-origin: 384px 31.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: 379px 8px; transform-origin: 379px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eIn neural net processing of the Mnist database of digits(0-9) one Convolutional Neural Network method uses 9x9 kernels on the 28x28 images to return the Valid 20x20 central core for the next processing step. The third image includes a black border of four around Valid to maintain scale.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 194.5px; 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 97.25px; text-align: left; transform-origin: 384px 97.25px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 252px;height: 189px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"252\" height=\"189\"\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: 2px 8px; transform-origin: 2px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 252px;height: 189px\" src=\"data:image/png;base64,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JMnSpUtT3FNQULB8+fKWlpaFCxfu2rVr8uTJqb+P6bvmbd+Z8frrr99www3z5s2bOHFi2luSJEmam5vfeOONK664ovuwsLDw008/TXHPoEGDWltba2pqkiTZunVrXV3diSeemOIvaWxpaVm7du3UqVO7D/fv35/uNffJJ5/89cO+ffumteTr6urqUn8zZI8dO3aUlZX1/M0MGTLko48+SnHPl19+uXv37kceeaT7cMaMGanfqP/Opf2uiuhWrVoV4V12W7ZsOeecc1auXLn/fxw8eDDdSY2NjeXl5R988EFXV1dra+u4ceP+9re/pTupx89//vPU32X3z3/+s+ctW9u2bRs3btzq1atT3LN///4xY8asXLmyq6vr888/Hz9+/BtvvJHinm5jx45dtWpV2iv+ZdOmTWeddVb3p/TOnTsvuuiiZ555JsU9W7duLS8v37ZtW1dX17p160aPHr1z584U9xwGrpCyoaamZvfu3dddd13Pn1RVVd15550pTiopKbn99tunTJkycuTIdevWzZgx48ILL0xxTzRlZWWzZ8+urKw866yzNm7cOHPmzHRftz/mmGMefvjhm266adGiRU1NTVdffXXq3xvb2dnZ3t4e5NXQJEnKy8tvu+22adOmDR8+/N133506deqUKVNS3FNUVHTzzTdPmjSpvLx869atDz30UOrfWP1d842x5KSzs7Otre3kk08Ocgsoms7Ozr179x533HFx3iPz1VdfHXvssf69vk33P1l+fn6Qv6KOjo59+/YFebvvd02QAAghyv+1AXCUEyQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABC+G8Tb/bPfPYYhwAAAABJRU5ErkJggg==\" data-image-state=\"image-loaded\" width=\"252\" height=\"189\"\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: 2px 8px; transform-origin: 2px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 252px;height: 189px\" src=\"data:image/png;base64,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PcuyxsbGQ4cONTY2Zlk2f/785ubmjo6OSu8RgAnJQZAuXbq0devW3bt3b9myZeyZ3t7ekydPlhY8fPiwpiYHJwLAj6n0Ldp/8a9//eu11147e/bsw//16NGja9euvfLKK93d3aOjo/39/atXr75w4cKTf9ZbdgAl8d+yi/57SMeOHfvuu++2bdtWeqalpeXTTz9tbW3dtGnTihUrLl++vGPHDr+EBJB3efopu1RNTU1+uA5gTKFQCP5Tdj56ASAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEHKjUKhUOktPCNT5EynyGlmU+ZMp8hplpUgARCCIAEQwrTR0dFK76FcmpqaKr0FgEC6uroqvYUfU81BAiBHvGUHQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIz1V6A/x3g4OD169fLz0sFAqzZ8+u4H7K5OLFi2vWrCk97Ovru3bt2ssvv1x9Eze+f6ZVeXF7enp6e3sbGhpef/310pNVeUGfPNOqvKDPjCDlwKlTp/bv319bWzv28ODBg9//xl0dDh8+fPz48YsXL449PH36dFtb2+rVqzs6Ot5///0PP/ywstubRD840+q7uHv27Dl37tzKlSu7urrq6uqOHj1aW1tblRf0qWdafRf0mRolvI8++uiLL76o9C7KZWho6OOPP37ttdfeeuutsWcePXr02muvdXd3j46O3rlz55e//OU///nPiu5xcjx5pqNVd3GvXLny6quvDg0NjT1ct27dl19+WZUX9KlnOlp1F/QZ8xlSDly9enXJkiWDg4PDw8OV3svkO3DgQENDw2effVZ65sKFC/X19cuWLcuyrKGhYe3ate3t7ZXb4KR58kyzqru49fX1R44cmTNnztjDxYsX37p1qyov6FPPNKu6C/qMecsuupGRkRs3buzZs2doaKhYLG7cuHHv3r2V3tRk2rVrV01Nzfnz50vPFIvF5cuXlx7OmjUr+IjicXryTKvv4i5atGjRokVjX/f29p49e3bbtm1dXV3Vd0GfeqbVd0GfMXdI0fX39zc3Nx85cuTrr7/+6quvLly4cPz48UpvajLV1PzwL+HIyMi0adNKD6dPnz5aFTPpnzzTKr64AwMDH3zwwfbt21955ZVqvaBjvn+mVXxBnw1Biq6xsfHQoUONjY1Zls2fP7+5ubmjo6PSmyqvGTNmPH78uPRwZGRk+vTpFdxP+VTrxf3mm282bNiwefPm7du3Z1V9QX9wptV6QZ8ZQYqut7f35MmTpYcPHz588h/aVeaFF17o7OwsPSwWiytXrqzgfsqnKi/upUuXtm7dunv37i1btow9U60X9MkzrcoL+ix5saJ78ODBrl27enp6siwbGBg4e/bs+vXrK72p8nrjjTeyLBv7rKWnp6e9vX3VqlWV3lRZVN/F7evr27Fjx+eff/7OO+8MDw8PDw+PjIxU5QV96plW3wV9xvxQQ3RNTU2tra2bNm1asWLF5cuXd+zYUfW/1lBTU7Nv376dO3cuXbq0s7Ozra1t3rx5ld5UWVTfxT127Nh33323bdu20jMtLS2ffvpp9V3Q/+tMq+yCPmP+F+b58Pjx4/v378+cOXNKvQPw73//eyqc8tS5uC4oP06QAAhBwAEIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAI4X8AiB24LVwZWacAAAAASUVORK5CYII=\" data-image-state=\"image-loaded\" width=\"252\" height=\"189\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 147px; 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 73.5px; text-align: left; transform-origin: 384px 73.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: 91px 8px; transform-origin: 91px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe entire Matlab code from \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.youtube.com/watch?v=ZOXOwYUVCqw\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eConvolutional Neural Networks in Matlab by Nuruzzaman Faruqui\u003c/span\u003e\u003c/span\u003e\u003c/a\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: 70px 8px; transform-origin: 70px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e , a Matlab Neural Net Tutorial for Mnist processing, is included in the function template. Loading the Mnist Train/Test Images/Labels from posted MAT files or \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"/#null\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eTHE MNIST DATABASE of handwritten digits\u003c/span\u003e\u003c/span\u003e\u003c/a\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: 181.5px 8px; transform-origin: 181.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e are provided. The Neural Net tutorial explains Neural Net processing for Digit Recognition. The neural net training method uses 784 input nodes,  20 convolutions(9x9), ReLU, Pooling, batch sampling, single hidden layer of 100 nodes, updating parameters via backwards propagation, and updating convolution kernels. The digit prediction accuracy is \u0026gt;94% after 50s of training. The final feature kernels are very amorphous and unexpected.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function mValidConv2=create_ValidConv2(m,K)\r\n  mValidConv2=conv2(m,K,'same');\r\nend\r\n\r\n% Code from Convolutional Neural Network in Matlab by Nuruzzaman Faruqui\r\n% Youtube:  https://www.youtube.com/watch?v=ZOXOwYUVCqw\r\n% I have made comments noted by raz and a couple speed enhancements\r\n% I also provide alternate direct source for MNIST files as .mat files\r\n%{\r\nfunction MNIST_Process\r\n%Based upon https://www.youtube.com/watch?v=ZOXOwYUVCqw\r\n%784 input nodes;20 conv 9x9 filters,ReLU;2x2 submatrix Pooling layer,single hidden layer 100 nodes\r\n\r\n%Matlab Convolutional Neural Network in Matlab\r\n%Processing MNIST digits using conv, contents, \r\n%MNIST files  http://yann.lecun.com/exdb/mnist/\r\n%Create filters\r\n%File Exchange NN https://www.mathworks.com/matlabcentral/fileexchange/59223-convolution-neural-network-simple-code-simple-to-use?s_tid=ta_fx_results\r\n%\r\n%use Test_images.mat if avail, use MNIST ubyte files if avail, load Test_images.mat\r\ndir_struct=dir;\r\nfilenames={dir_struct.name};\r\nfn='Test_images.mat';\r\nptr=find(ismember(filenames,fn));\r\nif ~isempty(ptr) % Test images/labels mat files exist\r\n tic;\r\n load('Test_images'); % images [28,28,10000] uint8\r\n load('Test_labels'); % labels [10000,1] uint8 values 0:9\r\n fprintf('Images:%i  Time:%.2f\\n',size(images,3),toc);\r\n Images=double(images)/255; %raz values must be 0:1 or bad things happen\r\n Labels=double(labels);\r\n Labels(Labels==0)=10; % 0 remapped to 10\r\n\r\nelse % Check for Mnist file\r\n %MNIST files source  http://yann.lecun.com/exdb/mnist/\r\n fn='t10k-images.idx3-ubyte'; %NMIST gzip expanded file for Test Images 10K\r\n filenames={dir_struct.name};\r\n ptr=find(ismember(filenames,fn));\r\n if ~isempty(ptr)\r\n  tic\r\n  Images=loadMNISTImages(fn);\r\n  fprintf('MNIST Images Process Time: %.2f\\n',toc); %raz\r\n  Images=reshape(Images,28,28,[]); % Un-vectorize the images\r\n  %Images already scaled by 1/255 in loadMNISTImages\r\n \r\n  Labels=loadMNISTLabels('t10k-labels.idx1-ubyte');\r\n  Labels(Labels==0)=10; % 0 to 10\r\nelse % download Test_images.mat, Test_labels.mat and load\r\n fnameTestI='Test_images.mat'; %load('Test_images.mat') creates images(28,28,10000) 1.6MB\r\n fnameTrainI='Train_images.mat'; %load('Train_images.mat') creates images(28,28,60000)  9.9MB\r\n fnameTestL='Test_labels.mat'; %load('Test_images.mat') creates labels(10000,1) 5KB\r\n fnameTrainL='Train_labels.mat'; %load('Train_images.mat') creates labels(60000,1) 30KB\r\n \r\n %Google Drive Dowloads need to come from shared files\r\n% Tweak link: file/d/ to uc?export=download\u0026id=   while removing /view?usp=sharing\r\n% https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=sharing\r\n% https://drive.google.com/uc?export=download\u0026id=1v3GsGgP3p905wzdvUqypL_-djYmxiyzK\r\n \r\n\r\n  urlTeI='https://drive.google.com/uc?export=download\u0026id=10ReGWlfSvr9p6uq6FQlqw6vw3UXgWo57';\r\n  urlTeL='https://drive.google.com/uc?export=download\u0026id=105zTcVgItZ2JjFiUkJulU33R7lXNl29-';\r\n  urlTrI='https://drive.google.com/uc?export=download\u0026id=1HJZssH6_9OcQ8mXwS_DtvsS_Kk86BDFY';\r\n  urlTrL='https://drive.google.com/uc?export=download\u0026id=1KNTn2eNXbQkQJNe6xhO1LMmvkDRP-XLq';\r\n \r\n  tic\r\n  urlwrite(urlTeI,fnameTestI); %Writing GoogleDrive MNIST_Test_images.pdf  Test_images.mat \r\n  fprintf('Download 1.6MB Time: %.1f  sec\\n\\n',toc); %1.6MB download Time, about 1.1 sec\r\n \r\n  tic\r\n  urlwrite(urlTeL,fnameTestL); %Writing GoogleDrive MNIST_Test_labels.pdf  Test_labels.mat\r\n  fprintf('Download 5KB Time: %.1f  sec\\n\\n',toc); %5KB download Time, about 0.5 sec\r\n \r\n  tic\r\n  urlwrite(urlTrI,fnameTrainI); %Writing GoogleDrive MNIST_Train_images.pdf  Train_images.mat\r\n  fprintf('Download 9.9MB Time: %.1f  sec\\n\\n',toc); %9.9MB download Time, about 4.1 sec\r\n \r\n  tic\r\n  urlwrite(urlTrL,fnameTrainL); %Writing GoogleDrive MNIST_Train_labels.pdf  Train_labels.mat\r\n  fprintf('Download 30KB Time: %.1f  sec\\n\\n',toc); %30KB download Time, about 0.6 sec\r\n\r\n  tic\r\n  load('Test_images'); % images [28,28,10000] uint8\r\n  load('Test_labels'); % labels [10000,1] uint8 values 0:9\r\n  fprintf('Images:%i  Time:%.2f\\n',size(images,3),toc); %.05s\r\n  Images=double(images)/255; %raz values must be 0:1 or bad things happen\r\n  Labels=double(labels);\r\n  Labels(Labels==0)=10; % 0 to 10\r\n end % if MNIST ubyte files\r\n\r\nend % if Test_images.mat\r\n\r\n\r\nrng(1); %raz not liked by curretn matlab\r\n\r\nW1=.01*randn([9 9 20]); %Conv Kernels   base .01\r\nW5=(2*rand(100,2000)-1)*sqrt(6)/sqrt(360+2000); %Hidden layer coeff of 100 pooled\r\nWo=(2*rand(10, 100)-1)*sqrt(6)/sqrt( 10+ 100); %Output coeff to find 0:9 best match\r\n\r\nX=Images(:,:,1:8000);\r\nD=Labels(1:8000);\r\nztic=tic;\r\nfor epoch=1:3  %Repeat cycles of all Training data\r\n fprintf('epoch:%i  Time:%.2f\\n',epoch,toc(ztic));\r\n [W1, W5, Wo]=MnistConv(W1,W5,Wo,X,D);\r\nend %epoch\r\n\r\n%save('MnistConv.mat'); % Used for Post analysis, see video\r\n\r\nX=Images(:,:,8001:10000);\r\nD=Labels(8001:10000);\r\nacc=0;\r\nN=length(D);\r\n\r\nfor k=1:N\r\n x=X(:,:,k);\r\n y1=Conv(x,W1); %Neural Net Processing  W1 kernels on image-x\r\n y2=ReLU(y1);   %Rectification process\r\n y3=Pool(y2);   %Take 20x20 conv images into 100 values\r\n y4=reshape(y3,[],1);\r\n v5=W5*y4;      %Hidden layer weights\r\n y5=ReLU(v5);   %Rectification process\r\n v=Wo*y5;       %Wo Output weight processing\r\n y=Softmax(v);  %create vector length 10 of expected probability, uses exp(x) smoothing\r\n                %Needed in training but not sure why in evaluation\r\n \r\n [~,i]=max(y);\r\n if i==D(k)\r\n  acc=acc+1;\r\n end\r\nend %k\r\n\r\n acc=acc/N;\r\n fprintf('Accuracy is %.2f%%  Time:%.2f\\n',100*acc,toc(ztic));  %raz output/time\r\n\r\nend% MNIST_Process\r\n\r\nfunction [W1, W5,Wo]=MnistConv(W1, W5,Wo,X,D)\r\n alpha=.01;\r\n beta=0.95;\r\n z=reshape(1:100,10,10); % raz\r\n kmap=kron(z,ones(2)); % raz\r\n \r\n momentum1=zeros(size(W1));\r\n momentum5=zeros(size(W5));\r\n momentumo=zeros(size(Wo));\r\n \r\n N=length(D);\r\n \r\n bsize=100;\r\n blist=1:bsize:(N-bsize+1);\r\n \r\n for batch=1:length(blist) % Batch/Updates, each Batch creates updates to Params\r\n  dW1=zeros(size(W1));\r\n  dW5=zeros(size(W5));\r\n  dWo=zeros(size(Wo));\r\n  \r\n  begin=blist(batch);\r\n  for k=begin:begin+bsize-1  %Subset Group of Training samples for param adjust\r\n   x=X(:,:,k);\r\n   y1=Conv(x,W1); %8K/5.8s  3.5s\r\n   y2=ReLU(y1);\r\n   y3=Pool(y2);\r\n   y4=reshape(y3,[],1);\r\n   v5=W5*y4;\r\n   y5=ReLU(v5);\r\n   v=Wo*y5;\r\n   y=Softmax(v); %10 Probability Bins for [1-9 0] \r\n   \r\n   d=zeros(10,1);\r\n   d(sub2ind(size(d),D(k),1))=1;\r\n   \r\n    e=d-y; % raz should this be (e-y)^2*sign(e-y)?\r\n    delta=e;\r\n    e5=Wo'*delta;\r\n    delta5=(y5\u003e0).*e5;\r\n    e4=W5'*delta5;\r\n    e3=reshape(e4,size(y3));\r\n    e2=zeros(size(y2));\r\n    W3=ones(size(y2))/(2*2);\r\n    \r\n    for c=1:20\r\n     %e2(:,:,c)=kron(e3(:,:,c),ones([2 2])).*W3(:,:,c); %160K/4.5s\r\n     e3c=e3(:,:,c); %160K/.27 raz\r\n     e2(:,:,c)=e3c(kmap).*W3(:,:,c);  %160K/.8s  raz\r\n    end %c\r\n    \r\n    delta2=(y2\u003e0).*e2;\r\n    delta1_x=zeros(size(W1)); \r\n    \r\n    for c=1:20\r\n     delta1_x(:,:,c)=conv2(x(:,:),rot90(delta2(:,:,c),2),'valid'); %160K/5.3s\r\n    end %c\r\n    \r\n    dW1=dW1+delta1_x; %error per kernel plane\r\n    dW5=dW5+delta5*y4'; %8K/4.2s  100x2000\r\n    dWo=dWo+delta*y5';\r\n  end %k\r\n  dW1=dW1/bsize;\r\n  dW5=dW5/bsize;\r\n  dWo=dWo/bsize;\r\n  \r\n  momentum1=alpha*dW1+beta*momentum1;\r\n  W1       = W1+momentum1;\r\n  \r\n  momentum5=alpha*dW5+beta*momentum5;\r\n  W5       = W5+momentum5;\r\n  \r\n  momentumo=alpha*dWo+beta*momentumo;\r\n  Wo       = Wo+momentumo;\r\n  \r\n end % batch\r\n \r\nend %MnistConv\r\n\r\nfunction rng(x)\r\n randn('seed',x);\r\n rand('seed',x);\r\nend % rng\r\n\r\nfunction y=Pool(x)\r\n [xrow,xcol,numFilters]=size(x);\r\n y=zeros(xrow/2,xcol/2,numFilters);\r\n for k=1:numFilters\r\n  filter=ones(2)/(2*2);\r\n  image=conv2(x(:,:,k),filter,'valid');\r\n  y(:,:,k)=image(1:2:end,1:2:end);\r\n end\r\n\r\nend %Pool\r\n\r\nfunction y=Conv(x,W)\r\n [wrow,wcol,numFilters]=size(W);\r\n [xrow,xcol,~         ]=size(x);\r\n \r\n yrow=xrow-wrow+1;\r\n ycol=xcol-wcol+1;\r\n \r\n y=zeros(yrow,ycol,numFilters);\r\n \r\n for k=1:numFilters\r\n  filter=W(:,:,k);\r\n  filter=rot90(squeeze(filter),2); %200K/2.5s  raz remove test/92.15%\r\n  y(:,:,k)=conv2(x,filter,'valid'); %200K/3.7s  3.5s\r\n end\r\nend %Conv\r\n\r\nfunction y=Softmax(x)\r\n ex=exp(x);\r\n y=ex/sum(ex);\r\nend %Softmax\r\n\r\nfunction y=ReLU(x)\r\n y=max(0,x);\r\nend %ReLU\r\n\r\n\r\n\r\nfunction images=loadMNISTImages(filename)\r\n%\r\nfp=fopen(filename,'rb');\r\nassert(fp~=-1,['Could not open', filename,'']);\r\nmagic=fread(fp,1,'int32',0,'ieee-be');\r\nassert(magic==2051,['Bad magic number in', filename, '']); %2051 Images\r\nnumImages=fread(fp,1,'int32',0,'ieee-be');\r\nnumRows=fread(fp,1,'int32',0,'ieee-be');\r\nnumCols=fread(fp,1,'int32',0,'ieee-be');\r\nimages=fread(fp,inf,'unsigned char=\u003eunsigned char');\r\nfclose(fp);\r\nfprintf('Images:%i  rows:%i  cols:%i\\n',numImages,numRows,numCols); %raz\r\n\r\nimages=reshape(images,numCols,numRows,numImages);\r\nimages=permute(images,[2 1 3]); \r\n\r\nimages=reshape(images,size(images,1)*size(images,2),size(images,3)); %raz Will be reverted\r\nimages=double(images)/255;\r\n \r\nend %loadMNISTImages\r\n\r\nfunction labels=loadMNISTLabels(filename)\r\n%\r\nfp=fopen(filename,'rb');\r\nassert(fp~=-1,['Could not open', filename,'']);\r\nmagic=fread(fp,1,'int32',0,'ieee-be');\r\nassert(magic==2049,['Bad magic number in ', filename,'']);\r\nnumLabels=fread(fp,1,'int32',0,'ieee-be');\r\nlabels=fread(fp,inf,'unsigned char');\r\nassert(size(labels,1)==numLabels,'Mismatch in label count');\r\nfclose(fp);\r\nfprintf('Labels:%i\\n',numLabels); %raz\r\n\r\n\r\nend %loadMNISTLabels\r\n%}","test_suite":"%%\r\n%Google Drive Dowloads need to come from shared files\r\n% Tweak link: file/d/ to uc?export=download\u0026id=   while removing /view?usp=sharing\r\n% https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=sharing\r\n% https://drive.google.com/uc?export=download\u0026id=1v3GsGgP3p905wzdvUqypL_-djYmxiyzK\r\n fnameTestI='Test_images.mat'; %load('Test_images.mat') creates images(28,28,10000) 1.6MB\r\n fnameTrainI='Train_images.mat'; %load('Train_images.mat') creates images(28,28,60000)  9.9MB\r\n fnameTestL='Test_labels.mat'; %load('Test_images.mat') creates labels(10000,1) 5KB\r\n fnameTrainL='Train_labels.mat'; %load('Train_images.mat') creates labels(60000,1) 30KB\r\n \r\n urlTeI='https://drive.google.com/uc?export=download\u0026id=10ReGWlfSvr9p6uq6FQlqw6vw3UXgWo57';\r\n urlTeL='https://drive.google.com/uc?export=download\u0026id=105zTcVgItZ2JjFiUkJulU33R7lXNl29-';\r\n urlTrI='https://drive.google.com/uc?export=download\u0026id=1HJZssH6_9OcQ8mXwS_DtvsS_Kk86BDFY';\r\n urlTrL='https://drive.google.com/uc?export=download\u0026id=1KNTn2eNXbQkQJNe6xhO1LMmvkDRP-XLq';\r\n \r\n % fn.mat  https://drive.google.com/file/d/10GsOZTIjzMIuO7xAYIqLT1zIq9Cyubl-/view?usp=drive_link\r\n % Google Gives warning thus aborts urlwrite\r\n %\r\n %fname='Mnist_Test_images.pdf'\r\n %Fake name of .pdf on GoogleDrive,  write as a mat\r\n \r\n %url='https://drive.google.com/file/d/1mgxzsmVQNXgqHEdd61QR2r0STm3N9lgG/view?usp=drive_link';\r\n %ptr=strfind(url,'/view'); % Tweaking the url\r\n %url(ptr:end)=[];\r\n %url=strrep(url,'file/d/','uc?export=download\u0026id=');\r\n \r\n tic\r\n urlwrite(urlTeI,fnameTestI); %Writing GoogleDrive MNIST_Test_images.pdf  Test_images.mat\r\n fprintf('Download 1.6MB Time: %.1f  sec\\n',toc); %1.6MB download Time, about 1.5 sec\r\n \r\n tic\r\n urlwrite(urlTeL,fnameTestL); %Writing GoogleDrive MNIST_Test_labels.pdf  Test_labels.mat\r\n fprintf('Download 5KB Time: %.1f  sec\\n',toc); %5KB download Time, about .5 sec\r\n \r\n global labels images \r\n \r\n load('Test_images'); % images [28,28,10000] uint8\r\n load('Test_labels'); % labels [10000,1] uint8 values 0:9\r\n \r\n %Showing a Label and an image from Mnist\r\n ptr=randi(10000);\r\n fprintf('Label:%i\\n',labels(ptr));\r\n figure(1);imagesc(images(:,:,ptr)); colormap gray;\r\n \r\n \r\nvalid=1;\r\nassert(valid)\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n ptr=randi(10000);\r\n fprintf('Label:%i\\n',labels(ptr));\r\n m=double(images(:,:,ptr))/255;\r\n figure(2);imagesc(m); colormap gray;\r\n \r\n K=repmat([0 0 .5 1 1 1 .5 0 0],9,1); % Vert Bar\r\n mValidConv2=create_ValidConv2(m,K);\r\n figure(3);imagesc(mValidConv2); colormap gray;\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(5:end-4,5:end-4),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n ptr=randi(10000);\r\n fprintf('Label:%i\\n',labels(ptr));\r\n m=double(images(:,:,ptr))/255;\r\n figure(2);imagesc(m); colormap gray;\r\n \r\n K=repmat([0 0 .5 1 1 1 .5 0 0]',1,9); %Horiz Bar\r\n mValidConv2=create_ValidConv2(m,K);\r\n figure(3);imagesc(mValidConv2); colormap gray;\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(5:end-4,5:end-4),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n m=rand(24);\r\n K=repmat([0 .5 1 1 1 .5 0]',1,7); %Horiz Bar\r\n mValidConv2=create_ValidConv2(m,K)\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(4:end-3,4:end-3),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n%%\r\n%Showing a Label and an image from Mnist\r\n global labels images\r\n valid=1;\r\n m=rand(8);\r\n K=ones(3)/9;\r\n mValidConv2=create_ValidConv2(m,K)\r\n mc=conv2(m,K,'same');\r\n if ~isequal(mc(2:end-1,2:end-1),mValidConv2)\r\n  valid=0;\r\n end\r\n \r\nassert(valid)\r\n\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":0,"created_by":3097,"edited_by":3097,"edited_at":"2023-08-17T19:33:19.000Z","deleted_by":null,"deleted_at":null,"solvers_count":13,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-08-17T14:03:38.000Z","updated_at":"2025-12-09T23:45:29.000Z","published_at":"2023-08-17T19:33:20.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\u003eThis challenge is to return only the Valid portion of a 2-D convolution. Valid is deemed to be where all elements of the kernel are applied against the image. The (1,1) point with a ones(3) kernel would be invalid while point (2,2) would return a Valid convolution value. The images will be even-square,m, and the kernels will be odd-square,K.The m=ones(6) and K=ones(3) would return a 4x4 matrix of 9s.\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\u003emValidConv2=create_ValidConv2(m,K)\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\u003eIn neural net processing of the Mnist database of digits(0-9) one Convolutional Neural Network method uses 9x9 kernels on the 28x28 images to return the Valid 20x20 central core for the next processing step. The third image includes a black border of four around Valid to maintain scale.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"189\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"252\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"189\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"252\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId2\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"189\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"252\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId3\\\"/\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\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe entire Matlab code from \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.youtube.com/watch?v=ZOXOwYUVCqw\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eConvolutional Neural Networks in Matlab by Nuruzzaman Faruqui\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e , a Matlab Neural Net Tutorial for Mnist processing, is included in the function template. Loading the Mnist Train/Test Images/Labels from posted MAT files or \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eTHE MNIST DATABASE of handwritten digits\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e are provided. The Neural Net tutorial explains Neural Net processing for Digit Recognition. The neural net training method uses 784 input nodes,  20 convolutions(9x9), ReLU, Pooling, batch sampling, single hidden layer of 100 nodes, updating parameters via backwards propagation, and updating convolution kernels. The digit prediction accuracy is \u0026gt;94% after 50s of training. The final feature kernels are very amorphous and unexpected.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image2.png\",\"relationshipId\":\"rId2\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image3.png\",\"relationshipId\":\"rId3\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\",\"relationship\":null},{\"partUri\":\"/media/image2.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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JMnSpUtT3FNQULB8+fKWlpaFCxfu2rVr8uTJqb+P6bvmbd+Z8frrr99www3z5s2bOHFi2luSJEmam5vfeOONK664ovuwsLDw008/TXHPoEGDWltba2pqkiTZunVrXV3diSeemOIvaWxpaVm7du3UqVO7D/fv35/uNffJJ5/89cO+ffumteTr6urqUn8zZI8dO3aUlZX1/M0MGTLko48+SnHPl19+uXv37kceeaT7cMaMGanfqP/Opf2uiuhWrVoV4V12W7ZsOeecc1auXLn/fxw8eDDdSY2NjeXl5R988EFXV1dra+u4ceP+9re/pTupx89//vPU32X3z3/+s+ctW9u2bRs3btzq1atT3LN///4xY8asXLmyq6vr888/Hz9+/BtvvJHinm5jx45dtWpV2iv+ZdOmTWeddVb3p/TOnTsvuuiiZ555JsU9W7duLS8v37ZtW1dX17p160aPHr1z584U9xwGrpCyoaamZvfu3dddd13Pn1RVVd15550pTiopKbn99tunTJkycuTIdevWzZgx48ILL0xxTzRlZWWzZ8+urKw866yzNm7cOHPmzHRftz/mmGMefvjhm266adGiRU1NTVdffXXq3xvb2dnZ3t4e5NXQJEnKy8tvu+22adOmDR8+/N133506deqUKVNS3FNUVHTzzTdPmjSpvLx869atDz30UOrfWP1d842x5KSzs7Otre3kk08Ocgsoms7Ozr179x533HFx3iPz1VdfHXvssf69vk33P1l+fn6Qv6KOjo59+/YFebvvd02QAAghyv+1AXCUEyQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABC+G8Tb/bPfPYYhwAAAABJRU5ErkJggg==\",\"relationship\":null},{\"partUri\":\"/media/image3.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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PcuyxsbGQ4cONTY2Zlk2f/785ubmjo6OSu8RgAnJQZAuXbq0devW3bt3b9myZeyZ3t7ekydPlhY8fPiwpiYHJwLAj6n0Ldp/8a9//eu11147e/bsw//16NGja9euvfLKK93d3aOjo/39/atXr75w4cKTf9ZbdgAl8d+yi/57SMeOHfvuu++2bdtWeqalpeXTTz9tbW3dtGnTihUrLl++vGPHDr+EBJB3efopu1RNTU1+uA5gTKFQCP5Tdj56ASAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEHKjUKhUOktPCNT5EynyGlmU+ZMp8hplpUgARCCIAEQwrTR0dFK76FcmpqaKr0FgEC6uroqvYUfU81BAiBHvGUHQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIz1V6A/x3g4OD169fLz0sFAqzZ8+u4H7K5OLFi2vWrCk97Ovru3bt2ssvv1x9Eze+f6ZVeXF7enp6e3sbGhpef/310pNVeUGfPNOqvKDPjCDlwKlTp/bv319bWzv28ODBg9//xl0dDh8+fPz48YsXL449PH36dFtb2+rVqzs6Ot5///0PP/ywstubRD840+q7uHv27Dl37tzKlSu7urrq6uqOHj1aW1tblRf0qWdafRf0mRolvI8++uiLL76o9C7KZWho6OOPP37ttdfeeuutsWcePXr02muvdXd3j46O3rlz55e//OU///nPiu5xcjx5pqNVd3GvXLny6quvDg0NjT1ct27dl19+WZUX9KlnOlp1F/QZ8xlSDly9enXJkiWDg4PDw8OV3svkO3DgQENDw2effVZ65sKFC/X19cuWLcuyrKGhYe3ate3t7ZXb4KR58kyzqru49fX1R44cmTNnztjDxYsX37p1qyov6FPPNKu6C/qMecsuupGRkRs3buzZs2doaKhYLG7cuHHv3r2V3tRk2rVrV01Nzfnz50vPFIvF5cuXlx7OmjUr+IjicXryTKvv4i5atGjRokVjX/f29p49e3bbtm1dXV3Vd0GfeqbVd0GfMXdI0fX39zc3Nx85cuTrr7/+6quvLly4cPz48UpvajLV1PzwL+HIyMi0adNKD6dPnz5aFTPpnzzTKr64AwMDH3zwwfbt21955ZVqvaBjvn+mVXxBnw1Biq6xsfHQoUONjY1Zls2fP7+5ubmjo6PSmyqvGTNmPH78uPRwZGRk+vTpFdxP+VTrxf3mm282bNiwefPm7du3Z1V9QX9wptV6QZ8ZQYqut7f35MmTpYcPHz588h/aVeaFF17o7OwsPSwWiytXrqzgfsqnKi/upUuXtm7dunv37i1btow9U60X9MkzrcoL+ix5saJ78ODBrl27enp6siwbGBg4e/bs+vXrK72p8nrjjTeyLBv7rKWnp6e9vX3VqlWV3lRZVN/F7evr27Fjx+eff/7OO+8MDw8PDw+PjIxU5QV96plW3wV9xvxQQ3RNTU2tra2bNm1asWLF5cuXd+zYUfW/1lBTU7Nv376dO3cuXbq0s7Ozra1t3rx5ld5UWVTfxT127Nh33323bdu20jMtLS2ffvpp9V3Q/+tMq+yCPmP+F+b58Pjx4/v378+cOXNKvQPw73//eyqc8tS5uC4oP06QAAhBwAEIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAI4X8AiB24LVwZWacAAAAASUVORK5CYII=\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":42793,"title":"Fast 1-D Convolution (full shape)","description":"This is the first problem in the \u003chttp://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution fast 1-D convolution series\u003e. This problem asks you to find a fast algorithm to compute the 1-D convolution in its full output shape.  \r\n\r\nThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in *conv* function invoked in the form *conv(u,v,'full')*, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out. \r\n\r\n* Next problem: \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape Fast 1-D Convolution (same shape)\u003e.","description_html":"\u003cp\u003eThis is the first problem in the \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\"\u003efast 1-D convolution series\u003c/a\u003e. This problem asks you to find a fast algorithm to compute the 1-D convolution in its full output shape.\u003c/p\u003e\u003cp\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in \u003cb\u003econv\u003c/b\u003e function invoked in the form \u003cb\u003econv(u,v,'full')\u003c/b\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\u003c/p\u003e\u003cul\u003e\u003cli\u003eNext problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\"\u003eFast 1-D Convolution (same shape)\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e","function_template":"function y = fconv1f(u,v)\r\n  y = conv(u,v,'full');   % Extremely inefficient solution!\r\nend","test_suite":"%%\r\n%{\r\n╔═════════════════════════════════════════════════════════════╗\r\n║ Please note that problems in this series are designed for   ║\r\n║ optimizing the code performance, rather than the usual Cody ║\r\n║ \"size\". We are achieving this goal by courtesy of LY Cao's  ║ \r\n║ new scoring function, which automatically grants a better   ║\r\n║ score to a faster solution. Kindly note that simply using   ║\r\n║ the conv function may result in a poor score or even failure║\r\n║ in one of the tests. Suggestions and comments are welcome.  ║\r\n║                                                             ║\r\n║ Thanks \u0026 have fun!                                          ║\r\n║ Peng                                                        ║\r\n╚═════════════════════════════════════════════════════════════╝\r\n%}\r\n\r\n%%\r\nfid = fopen('EvaluateSolution.p','wb'); \r\nfwrite(fid,uint8(sscanf('7630312E30307630302E30300005B01CF7473FB1000000B50000010D000001A93014D309F9979F2A2C808C4F104ACA1480D0378FBCF4FF1C4C94A38C84A4969D0A597F5F12C8D564E7CD9584DF8BDD849A3B8C5FDEB66A3837A064275728B38736860BB79ABC4B3091D37C9A2010BE0378E708E59716738F85AA4AEBC8982C45E6CD45BAD19BD043D16D5834122D405752633CE6BD78ABA0676336E7BCDD4F2E181FF1CE8E9165F6BF30D850ED74385A40BDEB73AD82518B4CF2BB034951B1D23D360EDF335C22C209AAB3857BCEF61D192170FDE9D5449721A6B6DD082257E430059753696F1C5CD66E6B09AD24270B0335E830203EACA5BDF3E2A57620D5DB44A96AFCDE0387EF112F2A83FBF90E4AF09F9D4FCAA22134055610D0F7B55568D50A52CD5C46A3F0CA655C1B68','%2x')));\r\nfclose(fid);\r\n\r\n%%\r\nu = 1; v = 1;\r\ny_correct = 1;\r\nassert(isequal(fconv1f(u,v),y_correct))\r\n\r\n%%\r\nu = 1:10; v = 1:5;\r\ny_correct = [1,4,10,20,35,50,65,80,95,110,114,106,85,50];\r\nassert(all(abs(fconv1f(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = [2 -4 0 1].'; v = [1:5].';\r\ny_correct = [2,0,-2,-3,-4,-17,4,5].';\r\nassert(all(abs(fconv1f(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(20,1); v = rand(10,1);\r\ny_correct = conv(u,v,'full');\r\nassert(all(abs(fconv1f(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\n% Large data size\r\nglobal sol_score\r\nu = rand(8e5,1); v = rand(1e5,1);\r\nt = builtin('tic');\r\ny = fconv1f(u,v);\r\nsol_score = 50*builtin('toc',t);\r\nAbsTol = 1e-6;   % Maximum absolute error tolerance\r\npass = EvaluateSolution(u,v,y,AbsTol);  \r\nassert(pass);\r\n\r\n%%\r\n% New scoring function by LY Cao\r\nglobal sol_score\r\nfid = fopen('score.p','wb');\r\nfwrite(fid,sscanf('7630312E30307630302E30300008501CD77E9FB100000035000001110000018422762999A8C1DE50537BEE443F4D73651F830FC6C78ADFB7DF68DF98823F565884DC58E21C7E397E3D26E4FFEA9A0D83589ABB5C0B0B553B44CFD79C9B272D11DF1965AD538598E8319529727DF4C4CF36A6016DD7816544AE5A8F64C9B2D9D0C4B94DD5EDF14595CBFE3D402647499EA3D9D125AC927454ED85973BCD1AAEA536D5A6CDDCD78A0211E8179603FFE12E4AB0E4704EA195704428700BAE5C4DFD42FF1A8760EDF2721F9724498ECC9F957735E7A3CDB9630DB17DF92ACE8F486706020E0A8D022D14BC313879724760AE20D67F572DD85211E4BEA45CDF3E22976253F113AEA96C1FF907329E4BD429BCFC6331077DA21F05D791DA6ECCF680D2E23AC77DFCE5C1D9869D3098F5B89FF92A','%2x'));\r\nfclose(fid);\r\nscore(sol_score);\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":6,"created_by":12569,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":34,"test_suite_updated_at":"2016-04-04T03:53:09.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2016-04-02T21:05:59.000Z","updated_at":"2025-12-09T13:00:47.000Z","published_at":"2016-04-03T19:56: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\u003eThis is the first problem in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efast 1-D convolution series\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. This problem asks you to find a fast algorithm to compute the 1-D convolution in its full output shape.\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\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e function invoked in the form\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv(u,v,'full')\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\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\u003eNext problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (same shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\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":42795,"title":" Fast 1-D Convolution (valid shape) ","description":"Pursuant to the first problem in the \u003chttp://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution fast 1-D convolution series\u003e, this problem asks for the fast algorithm to compute the 1-D convolution in its \"valid\" output shape.  \r\n\r\nThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in *conv* function invoked in the form *conv(u,v,'valid')*, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out. \r\n\r\n* Previous problem: \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape Fast 1-D Convolution (same shape)\u003e.","description_html":"\u003cp\u003ePursuant to the first problem in the \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\"\u003efast 1-D convolution series\u003c/a\u003e, this problem asks for the fast algorithm to compute the 1-D convolution in its \"valid\" output shape.\u003c/p\u003e\u003cp\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in \u003cb\u003econv\u003c/b\u003e function invoked in the form \u003cb\u003econv(u,v,'valid')\u003c/b\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\u003c/p\u003e\u003cul\u003e\u003cli\u003ePrevious problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\"\u003eFast 1-D Convolution (same shape)\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e","function_template":"function w = fconv1v(u,v)\r\n  % Extremely inefficient solution not guaranteed to pass all tests :-(\r\n  w = conv(u,v,'valid'); \r\nend","test_suite":"%%\r\n%{\r\n╔═════════════════════════════════════════════════════════════╗\r\n║ Please note that problems in this series are designed for   ║\r\n║ optimizing the code performance, rather than the usual Cody ║\r\n║ \"size\". We are achieving this goal by courtesy of LY Cao's  ║ \r\n║ new scoring function, which automatically grants a better   ║\r\n║ score to a faster solution. Kindly note that simply using   ║\r\n║ the conv function may result in a poor score or even failure║\r\n║ in one of the tests. Suggestions and comments are welcome.  ║\r\n║                                                             ║\r\n║ Thanks \u0026 have fun!                                          ║\r\n║ Peng                                                        ║\r\n╚═════════════════════════════════════════════════════════════╝\r\n%}\r\n\r\n%%\r\nfid = fopen('EvaluateSolution.p','wb'); \r\nfwrite(fid,uint8(sscanf('7630312E30307630302E3030000CF01CCC561FB1000000C30000012D000001D160E44E2EC6DB5CE66B30F9B560AF40D6A7226365293F6413AE84ABD44D4C7EE5C617DCDAC2521B24B2951C23F50BA9DAA4179B35DCED27A697FC9CA9A308698729973CACEC16670C077236F96E9D16612152B0C32FC57E4755E80E40AC876804B7835D9703BC5A1D6FC519FDEDE22237DC59455FF0014FEBCEF1CB2A840158E11CDD5D6C78D594F50B575A4DF9FB54705F2C6D40341F12CE207B892CBEDEC018A1F94CFA1D5FBB9E1912BA424CD5C6C422D6F3451A8BDD2543834B3FFAD3107D8F16C78D75DD9F3AD197D5591B1686E190D8DF4B5EF3AC28C641296E92FB02BC395D442C03480E156E48F8B61AA3C6F1526AA95C1C466C77A3803AF8523098B0A3ED10A07E2F93274DC8207B05A572988754AAC211A330C2FEC7928CFD51D3A6FBDD9FFA6036C948E0C4239A16','%2x')));\r\nfclose(fid);\r\n\r\n%%\r\nu = 1; v = 1;\r\ny_correct = 1;\r\nassert(isequal(fconv1v(u,v),y_correct))\r\n\r\n%%\r\nu = 1:10; v = 1:5;\r\ny_correct = conv(u,v,'valid');\r\nassert(all(abs(fconv1v(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = 1:5; v = 1:10;\r\ny_correct = zeros(1,0);\r\nassert(isequal(fconv1v(u,v),y_correct))\r\n\r\n%%\r\nu = rand(20,1); v = rand(10,1);\r\ny_correct = conv(u,v,'valid');\r\nassert(all(abs(fconv1v(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(10,1); v = rand(20,1);\r\ny_correct = zeros(0,1);\r\nassert(isequal(fconv1v(u,v),y_correct))\r\n\r\n%%\r\n% Large data size\r\nglobal sol_score\r\nAbsTol = 1e-6;   % Maximum absolute error tolerance\r\nuu = rand(5e6,15); vv = rand(2e5,15);\r\nfor iter = 15:-1:1\r\n    u = uu(:,iter); v = vv(:,iter);\r\n    t = builtin('tic');\r\n    y = fconv1v(u,v);\r\n    timeSpan(iter) = builtin('toc',t);\r\n    pass(iter) = EvaluateSolution(u,v,y,AbsTol);  \r\nend\r\nsol_score = sum(timeSpan);\r\nassert(all(pass));\r\n\r\n%%\r\n% New scoring function by LY Cao\r\nglobal sol_score\r\nfid = fopen('score.p','wb');\r\nfwrite(fid,sscanf('7630312E30307630302E30300008501CD77E9FB100000035000001110000018422762999A8C1DE50537BEE443F4D73651F830FC6C78ADFB7DF68DF98823F565884DC58E21C7E397E3D26E4FFEA9A0D83589ABB5C0B0B553B44CFD79C9B272D11DF1965AD538598E8319529727DF4C4CF36A6016DD7816544AE5A8F64C9B2D9D0C4B94DD5EDF14595CBFE3D402647499EA3D9D125AC927454ED85973BCD1AAEA536D5A6CDDCD78A0211E8179603FFE12E4AB0E4704EA195704428700BAE5C4DFD42FF1A8760EDF2721F9724498ECC9F957735E7A3CDB9630DB17DF92ACE8F486706020E0A8D022D14BC313879724760AE20D67F572DD85211E4BEA45CDF3E22976253F113AEA96C1FF907329E4BD429BCFC6331077DA21F05D791DA6ECCF680D2E23AC77DFCE5C1D9869D3098F5B89FF92A','%2x'));\r\nfclose(fid);\r\nscore(sol_score);","published":true,"deleted":false,"likes_count":2,"comments_count":1,"created_by":12569,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":17,"test_suite_updated_at":"2016-04-05T21:09:16.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2016-04-02T21:30:34.000Z","updated_at":"2025-12-21T14:08:51.000Z","published_at":"2016-04-04T01:47: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\":[],\"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\u003ePursuant to the first problem in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efast 1-D convolution series\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, this problem asks for the fast algorithm to compute the 1-D convolution in its \\\"valid\\\" output shape.\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\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e function invoked in the form\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv(u,v,'valid')\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\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\u003ePrevious problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42794-fast-1-d-convolution-same-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (same shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\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":42794,"title":" Fast 1-D Convolution (same shape) ","description":"Pursuant to the first problem in the \u003chttp://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution fast 1-D convolution series\u003e, this problem asks for the fast algorithm to compute the 1-D convolution with the same input-output shape.  \r\n\r\nThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in *conv* function invoked in the form *conv(u,v,'same')*, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out. \r\n\r\n* Previous problem:  \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42793-fast-1-d-convolution-full-shape Fast 1-D Convolution (full shape)\u003e\r\n* Next problem: \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42795-fast-1-d-convolution-valid-shape Fast 1-D Convolution (valid shape)\u003e\r\n","description_html":"\u003cp\u003ePursuant to the first problem in the \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\"\u003efast 1-D convolution series\u003c/a\u003e, this problem asks for the fast algorithm to compute the 1-D convolution with the same input-output shape.\u003c/p\u003e\u003cp\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in \u003cb\u003econv\u003c/b\u003e function invoked in the form \u003cb\u003econv(u,v,'same')\u003c/b\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\u003c/p\u003e\u003cul\u003e\u003cli\u003ePrevious problem:  \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42793-fast-1-d-convolution-full-shape\"\u003eFast 1-D Convolution (full shape)\u003c/a\u003e\u003c/li\u003e\u003cli\u003eNext problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42795-fast-1-d-convolution-valid-shape\"\u003eFast 1-D Convolution (valid shape)\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e","function_template":"function y = fconv1s(u,v)\r\n  % Extremely inefficient solution not guaranteed to pass all tests :-(\r\n  y = conv(u,v,'same'); \r\nend","test_suite":"%%\r\n%{\r\n╔═════════════════════════════════════════════════════════════╗\r\n║ Please note that problems in this series are designed for   ║\r\n║ optimizing the code performance, rather than the usual Cody ║\r\n║ \"size\". We are achieving this goal by courtesy of LY Cao's  ║ \r\n║ new scoring function, which automatically grants a better   ║\r\n║ score to a faster solution. Kindly note that simply using   ║\r\n║ the conv function may result in a poor score or even failure║\r\n║ in one of the tests. Suggestions and comments are welcome.  ║\r\n║                                                             ║\r\n║ Thanks \u0026 have fun!                                          ║\r\n║ Peng                                                        ║\r\n╚═════════════════════════════════════════════════════════════╝\r\n%}\r\n\r\n%%\r\nfid = fopen('EvaluateSolution.p','wb'); \r\nfwrite(fid,uint8(sscanf('7630312E30307630302E3030000E201CC0225FB10000010B000001480000023C141D1F2F8C075F9CDC9AA9EE4F066DD1BE8B37851CBC980DC3CFCB6C55FAA40EAEED061766137EB39A214C865F6410AAF263010C3B9D012F499C4718371499BB689324D8892718476958CEAC4EE884BB215750071FA3AEE658AB639696B588AA35864A8AF99C9981E6AB14F1BE31F76F320D6F1EA110DE5A9E1C9F4597921FF711410412A4E9C4AA1026E997F054CBEF2A6FC2607C95B65D62747B293B8A86A0D33830E20CCB930D6986416727FFE5CB77FE03A0722EE2B47A07493392D53C4C7A0995EDFA31DB344F2C390E67574523D59403673E343AB6E1A5D83D0EE6B4E784AAA80184B8295937D1648E6A92E82360BE54C82D837FFBE28102BB1EF99FEB94473DB16240A68474D4E8DA84CD1B6DB5AA3FB2921D378C5D78A3A006E36169618AF0F4A18645472518E158E85BB81BC6CBEDCD7A861A67E1ECC712442F423199F4EB715F9493CA','%2x')));\r\nfclose(fid);\r\n\r\n%%\r\nu = 1; v = 1;\r\ny_correct = 1;\r\nassert(isequal(fconv1s(u,v),y_correct))\r\n\r\n%%\r\nu = 1:10; v = 1:5;\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = 1:5; v = 1:10;\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(20,1); v = rand(10,1);\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\nu = rand(10,1); v = rand(20,1);\r\ny_correct = conv(u,v,'same');\r\nassert(all(abs(fconv1s(u,v)-y_correct)\u003c1e-10))\r\n\r\n%%\r\n% Large data size\r\nglobal sol_score\r\nAbsTol = 1e-6;   % Maximum absolute error tolerance\r\nfor iter = 15:-1:1\r\n    u = rand(5e6,1); v = rand(2e5,1);\r\n    t = builtin('tic');\r\n    y = fconv1s(u,v);\r\n    timeSpan(iter) = builtin('toc',t);\r\n    pass(iter) = EvaluateSolution(u,v,y,AbsTol);  \r\nend\r\nsol_score = sum(timeSpan);\r\nassert(all(pass));\r\n\r\n%%\r\n% New scoring function by LY Cao\r\nglobal sol_score\r\nfid = fopen('score.p','wb');\r\nfwrite(fid,sscanf('7630312E30307630302E30300008501CD77E9FB100000035000001110000018422762999A8C1DE50537BEE443F4D73651F830FC6C78ADFB7DF68DF98823F565884DC58E21C7E397E3D26E4FFEA9A0D83589ABB5C0B0B553B44CFD79C9B272D11DF1965AD538598E8319529727DF4C4CF36A6016DD7816544AE5A8F64C9B2D9D0C4B94DD5EDF14595CBFE3D402647499EA3D9D125AC927454ED85973BCD1AAEA536D5A6CDDCD78A0211E8179603FFE12E4AB0E4704EA195704428700BAE5C4DFD42FF1A8760EDF2721F9724498ECC9F957735E7A3CDB9630DB17DF92ACE8F486706020E0A8D022D14BC313879724760AE20D67F572DD85211E4BEA45CDF3E22976253F113AEA96C1FF907329E4BD429BCFC6331077DA21F05D791DA6ECCF680D2E23AC77DFCE5C1D9869D3098F5B89FF92A','%2x'));\r\nfclose(fid);\r\nscore(sol_score);","published":true,"deleted":false,"likes_count":1,"comments_count":2,"created_by":12569,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":17,"test_suite_updated_at":"2016-04-05T20:53:23.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2016-04-02T21:30:23.000Z","updated_at":"2025-12-21T14:01:33.000Z","published_at":"2016-04-04T01:47:11.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\u003ePursuant to the first problem in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/?term=Fast+1-D+Convolution\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efast 1-D convolution series\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, this problem asks for the fast algorithm to compute the 1-D convolution with the same input-output shape.\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\u003eThere exists a fast 1-D convolution algorithm way more efficient than MATLAB's built-in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e function invoked in the form\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003econv(u,v,'same')\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and the performance improvement is more pronounced when length(u) and/or length(v) are large. Do you know how? Try it out.\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\u003ePrevious problem: \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42793-fast-1-d-convolution-full-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (full shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\u003eNext problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42795-fast-1-d-convolution-valid-shape\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFast 1-D Convolution (valid shape)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\"}]}"}],"term":"tag:\"valid\"","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:\"valid\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"valid\"","","\"","valid","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007fb637b6c138\u003e":null,"#\u003cMathWorks::Search::Field:0x00007fb637b6a478\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007fb637b68038\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007fb637b6d178\u003e":1,"#\u003cMathWorks::Search::Field:0x00007fb637b6d0d8\u003e":50,"#\u003cMathWorks::Search::Field:0x00007fb637b6d038\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007fb637b6cf98\u003e":"tag:\"valid\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007fb637b6cf98\u003e":"tag:\"valid\""},"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:\"valid\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"valid\"","","\"","valid","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007fb637b6c138\u003e":null,"#\u003cMathWorks::Search::Field:0x00007fb637b6a478\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007fb637b68038\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007fb637b6d178\u003e":1,"#\u003cMathWorks::Search::Field:0x00007fb637b6d0d8\u003e":50,"#\u003cMathWorks::Search::Field:0x00007fb637b6d038\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007fb637b6cf98\u003e":"tag:\"valid\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007fb637b6cf98\u003e":"tag:\"valid\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":58877,"difficulty_rating":"easy"},{"id":42793,"difficulty_rating":"easy-medium"},{"id":42795,"difficulty_rating":"medium"},{"id":42794,"difficulty_rating":"medium"}]}}