Skip to content

Instantly share code, notes, and snippets.

@neworderofjamie
Created August 9, 2021 14:50
Show Gist options
  • Save neworderofjamie/3ecdd60522d5442b19e69addde74b1bc to your computer and use it in GitHub Desktop.
Save neworderofjamie/3ecdd60522d5442b19e69addde74b1bc to your computer and use it in GitHub Desktop.
Spike propagation through Toeplitz matrix
{
"cells": [
{
"cell_type": "code",
"execution_count": 167,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import cv2\n",
"\n",
"from scipy.linalg import toeplitz"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test data"
]
},
{
"cell_type": "code",
"execution_count": 168,
"metadata": {},
"outputs": [],
"source": [
"INPUT_SIZE = 64\n",
"OUTPUT_SIZE = 62\n",
"\n",
"spike_indices = np.asarray([65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,\n",
" 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,\n",
" 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,\n",
" 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108,\n",
" 109, 110, 129, 130, 131, 132, 133, 134, 135, 136, 137,\n",
" 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n",
" 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n",
" 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,\n",
" 171, 172, 173, 174, 193, 194, 195, 196, 197, 198, 199,\n",
" 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210,\n",
" 211, 212, 213, 214, 215, 257, 258, 259, 260, 261, 262,\n",
" 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,\n",
" 274, 275, 276, 277, 278, 279, 321, 322, 323, 324, 325,\n",
" 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336,\n",
" 337, 338, 339, 340, 341, 342, 343, 385, 386, 387, 388,\n",
" 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399,\n",
" 400, 401, 402, 403, 404, 405, 406, 407, 449, 450, 451,\n",
" 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462,\n",
" 463, 464, 465, 466, 467, 468, 469, 470, 471, 507, 508,\n",
" 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523,\n",
" 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534,\n",
" 535, 568, 569, 570, 571, 577, 578, 579, 580, 581, 582,\n",
" 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593,\n",
" 594, 595, 596, 597, 598, 599, 629, 630, 631, 632, 633,\n",
" 634, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650,\n",
" 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661,\n",
" 662, 663, 690, 691, 692, 693, 694, 695, 696, 697, 705,\n",
" 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716,\n",
" 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727,\n",
" 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760,\n",
" 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779,\n",
" 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790,\n",
" 791, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819,\n",
" 820, 821, 822, 823, 833, 834, 835, 836, 837, 838, 839,\n",
" 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850,\n",
" 851, 852, 853, 854, 855, 871, 872, 873, 874, 875, 876,\n",
" 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 897,\n",
" 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908,\n",
" 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919,\n",
" 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942,\n",
" 943, 944, 945, 946, 947, 948, 949, 992, 993, 994, 995,\n",
" 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006,\n",
" 1007, 1008, 1009, 1010, 1011, 1012, 1053, 1054, 1055, 1056, 1057,\n",
" 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068,\n",
" 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1114, 1115, 1116, 1117,\n",
" 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128,\n",
" 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1174,\n",
" 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185,\n",
" 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196,\n",
" 1197, 1198, 1199, 1200, 1201, 1217, 1218, 1219, 1220, 1221, 1222,\n",
" 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1235,\n",
" 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246,\n",
" 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257,\n",
" 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1281, 1282, 1283, 1284,\n",
" 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295,\n",
" 1296, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308,\n",
" 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319,\n",
" 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1345, 1346,\n",
" 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357,\n",
" 1358, 1359, 1360, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373,\n",
" 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384,\n",
" 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1409, 1410,\n",
" 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421,\n",
" 1422, 1423, 1424, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440,\n",
" 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451,\n",
" 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1473, 1474, 1475, 1476,\n",
" 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487,\n",
" 1488, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510,\n",
" 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521,\n",
" 1522, 1523, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545,\n",
" 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1568, 1569, 1570, 1571,\n",
" 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582,\n",
" 1583, 1584, 1585, 1586, 1587, 1588, 1601, 1602, 1603, 1604, 1605,\n",
" 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616,\n",
" 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646,\n",
" 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1665, 1666, 1667, 1668,\n",
" 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679,\n",
" 1680, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712,\n",
" 1713, 1714, 1715, 1716, 1717, 1718, 1729, 1730, 1731, 1732, 1733,\n",
" 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744,\n",
" 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780,\n",
" 1781, 1782, 1783, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800,\n",
" 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1837, 1838, 1839,\n",
" 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1857, 1858,\n",
" 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869,\n",
" 1870, 1871, 1872, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911,\n",
" 1912, 1913, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929,\n",
" 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1972, 1973, 1974, 1975,\n",
" 1976, 1977, 1978, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992,\n",
" 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2039, 2040, 2041,\n",
" 2042, 2043, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057,\n",
" 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2106, 2107, 2108, 2267,\n",
" 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278,\n",
" 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2305,\n",
" 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316,\n",
" 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2331, 2332, 2333, 2334,\n",
" 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345,\n",
" 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2370, 2371, 2372, 2373,\n",
" 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384,\n",
" 2385, 2386, 2387, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402,\n",
" 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413,\n",
" 2414, 2415, 2416, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442,\n",
" 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2459, 2460,\n",
" 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471,\n",
" 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2500, 2501,\n",
" 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512,\n",
" 2513, 2514, 2515, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530,\n",
" 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541,\n",
" 2542, 2543, 2544, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572,\n",
" 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2587, 2588, 2589, 2590,\n",
" 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601,\n",
" 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2630, 2631, 2632, 2633,\n",
" 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2651,\n",
" 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662,\n",
" 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2695,\n",
" 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706,\n",
" 2707, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724,\n",
" 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735,\n",
" 2736, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769,\n",
" 2770, 2771, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787,\n",
" 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798,\n",
" 2799, 2800, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833,\n",
" 2834, 2835, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851,\n",
" 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862,\n",
" 2863, 2864, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898,\n",
" 2899, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916,\n",
" 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927,\n",
" 2928, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2971,\n",
" 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982,\n",
" 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 3020,\n",
" 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3035, 3036, 3037, 3038,\n",
" 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049,\n",
" 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3085, 3086, 3087, 3088,\n",
" 3089, 3090, 3091, 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106,\n",
" 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117,\n",
" 3118, 3119, 3120, 3150, 3151, 3152, 3153, 3154, 3155, 3215, 3216,\n",
" 3217, 3218, 3219, 3280, 3281, 3282, 3283, 3345, 3346, 3347, 3410,\n",
" 3411, 3475, 3547, 3548, 3549, 3550, 3551, 3608, 3609, 3610, 3611,\n",
" 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3669, 3670, 3671, 3672,\n",
" 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683,\n",
" 3684, 3685, 3686, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737,\n",
" 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748,\n",
" 3749, 3750, 3751, 3752, 3753, 3790, 3791, 3792, 3793, 3794, 3795,\n",
" 3796, 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806,\n",
" 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817,\n",
" 3818, 3819, 3820, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858,\n",
" 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869,\n",
" 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880,\n",
" 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3912, 3913, 3914, 3915,\n",
" 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926,\n",
" 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937,\n",
" 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948,\n",
" 3949, 3950, 3951, 3952, 3953, 3954, 3973, 3974, 3975, 3976, 3977,\n",
" 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988,\n",
" 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999,\n",
" 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010,\n",
" 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021,\n",
" 4022, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044,\n",
" 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054, 4055,\n",
" 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066,\n",
" 4067, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077,\n",
" 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088], dtype=int)\n",
"\n",
"filt = np.asarray([[1, 0, -1],\n",
" [2, 0, -2],\n",
" [1, 0, -1]])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### OpenCV test"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x2b31746b7c8>"
]
},
"execution_count": 169,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAC6CAYAAAC3HRZZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAATvUlEQVR4nO3db4xc5XXH8e/p2tjBi7GXAHJsb00ki4KjBCKLGBEhihtKiRX7BSAoidzWyC+aViC5ClBL/SMlUniRQF9UUVeQxlJobZeEP0JRADlYCKkybAolNY4Doc6y2MUJMsW2iv9sTl/MHft65s7MnTv33zP7+0jWztyZ2Tken3189jzPvY+5OyIiEp7fqToAERHJRgO4iEigNICLiARKA7iISKA0gIuIBEoDuIhIoAYawM3sZjPbb2Zvmdn9eQUlUjXltoTAsq4DN7MR4BfAF4Bp4BXgTnd/I7/wRMqn3JZQDFKBXwO85e5vu/tJYDuwPp+wRCql3JYgzBngtUuBd2L3p4HPdXvBeTbP57NggLcU6ewjjnPST1gO36qv3B4ZXeBzxsaYe/TssVMX5BCFFOqCBf/Xduzo8Y9VEElvJ9+Z/o27X9x6fJABPOkHpa0fY2abgc0A8zmfz9lanj342gBvK1X5w09cVXUIXe3xXXl9q565Hc/rkcWL+cSWe7n8kSNnHt9/9+K8YpGCfGvd99uObXnmyxVE0tuBe//qV0nHB2mhTAPLY/eXAQdbn+TuE+6+2t1Xz2XeAG8nUpqeuR3P65FR/VYp1RhkAH8FWGlml5nZecAdwNP5hCVSKeW2BCFzC8XdT5vZXwDPAiPAd919b26RiVQka27P7N0fu7emqPBKNX/8aNuxj6bU4K+LQXrguPuPgB/lFItIbSi3JQQDDeDSru4TfSL9+Mann2o7tmWqnhN9/dr6evgrQ3UqvYhIoDSAi4gESi0UEelow4Jjbce2VBBHEYZhMlYVuIhIoDSAi4gESgO4iEig1AMXESnJ6NS5NfPpz/9v23P66c2rAhcRCZQGcBGRQKmFIrWWdOlhne0qddXaIgE4Nv7bM7cXHpgB4MMVI8C5Z7o+9f7VALw4tSr1+6kCFxEJlCpwqVyaDT5UdUtddKuymxX2uY+d3R/k4PWN29df+7O257387njfsagCFxEJlAZwEZFA9WyhmNl3gXXAYXf/VHRsDNgBrAAOALe7+5FO30Mk6z6oRbZOlNvSSdY2SXNyMm7++Nm13q2X541f0jbLtVnSVODfA25uOXY/sMvdVwK7ovsiofkeym0JWM8K3N1fNLMVLYfXAzdEt7cBu4H7coxLApS1yk5SxqSlcnt2aq2u48v8mvqtsuG3bd+ruR1d0qYYzcp70CsiZu2BX+ruhwCir5cMFIVIfSi3JRiFLyM0s83AZoD5nF/020kB8qysuwlpqWA8r0cWL644GoHeJ9E0tVbX8WV+TWmr7FbxTaCLrLybslbg75nZEoDo6+FOT3T3CXdf7e6r5zIv49uJlCZVbsfzemR0QakBijRlHcCfBjZGtzcC7f/ViIRJuS3BSLOM8F9pTOp83Mymgb8FvgnsNLNNwBRwW5FBSjHKao30UlXrRLkdnkHOgmxqb4+0t0S6tUmSpJmwhPy3cUuzCuXODg+tzTUSkZIptyV0uhbKkKtLld0qpAlLKVe3ZX5Zl/d1+n6DKmOpYDc6lV5EJFCqwIdAXavsJMNceY+surzqEHL35PHR3L5XHsv8si7vy1O3pYJF9ruTqAIXEQmUBnARkUBV0kIZ5l+j8xRSa6SX2fBv/u5NF8XulfPrfNHiLYE0il7mV1abJEnVE5ZJVIGLiARKk5gVG6Yqu9VsqLrjqqwOi5JUUeZ5reyil/nloY6Vd5MqcBGRQGkAFxEJlFooJRjmNkmS2dY6GRZZ12k3ntffZgd1V6e13t2oAhcRCZQq8AHNtuq6m9leeccr2DpUm/EqsmnOSxe2HRt8mR+EWGUnqfOEZRJV4CIigaqkAq9z1dpaRdY51jqY7VV33NLn3j9ze//d1W+zllRFTvzNF9uONWMNdZlfnpqf2YYFx84cW/XvdwH1qrybelbgZrbczF4ws31mttfM7omOj5nZ82b2ZvS1+owV6YNyW0KXpoVyGtji7lcAa4CvmtmVwP3ALndfCeyK7ouERLktQUuzI88h4FB0+6iZ7QOWAutpbEcFsA3YDdxXSJQiBcg7t2f27o/dW5NnqJnE2wBNExXEIcXpaxLTzFYAVwN7gEujH4DmD8IlHV6z2cwmzWzyFCcGi1akIP3mdjyvZ44dLzNUkTNST2Ka2SjwA+Bed//QrH15URJ3nyD6j3+hjXmWIKvUa5Jutk9yxv/+oU5oZsnteF7PG18eTF6fe8XEpt7LCNOe5BO6MyfpxCaAmxObWwl0GaGZzaWR4I+5+w+jw++Z2ZLo8SXA4WJCFCmOcltClmYVigGPAvvc/duxh54GNka3NwLta5ZEaky5LaFL00K5DvgK8DMza/6+/NfAN4GdZrYJmAJuKybEeuvWNpht7ZXm3zegVsqsy+1ubY9u68DTnqUZequl2R5ptkvgbAultZUSf35V0qxCeQno1BRcm284IuVRbkvodC2UAqWpRIexSg+wEheyV+dxwzIRGq+smxV3ayUef0wbOoiISF9UgVdsmHvow7DEUBrSVspF9NGrrtJb++LfqNESQ1XgIiKB0gAuIhIotVBqLG3bIYRWiyY2Z4ciJkLjbZYqJ0LruMRQFbiISKBUgQ+BkCZCVYnPXtknQs++rg7LFOu0xFAVuIhIoDSAi4gESi2UIVfX9orWiEsnRVyvpaj2Sj9rxOPPz4sqcBGRQKkCn8XqslmFJjYlrbpW52mWGMYfz6sSVwUuIhIoVeDSUdn9c/XFZRB1uNZ5tyWG8dt5VeJpduSZb2Yvm9l/mtleM/v76PhlZrbHzN40sx1mdt5AkYiUTLktoUvTQjkB3OjunwGuAm42szXAg8BD7r4SOAJsKi5MkUIotyVoaXbkceBYdHdu9MeBG4E/jo5vA/4O+E7+IUodFb1ZRRkTm8rt2aOSzSoo/topaXelH4n2DDwMPA/8EvjA3U9HT5kGlnZ47WYzmzSzyVOc6DtAkSJlze14Xs8cO15ewCIxqSYx3X0GuMrMFgFPAFckPa3DayeACYCFNpb4HBlOeUyCFl2JZ83teF7PG1+uvA5Y0ZtVzHnpwjPHtkx9GYBvrfs+MPgSw76WEbr7B8BuYA2wyMya/wEsAw72871E6kS5LSHqWYGb2cXAKXf/wMw+BvwBjUmeF4Bbge3ARuCpzt9F5Fz9nkRUxBLDvHN7ZNXlucSVlyePj1YdwlDJY5niwgONr1vH25cYXrN0CoAXp1aljilNC2UJsM3MRmhU7Dvd/RkzewPYbmZfB14FHk39riL1oNyWoKVZhfI6cHXC8beBa4oISqQMym0JXSVnYuosO+klxBx596aLYveq3UkdYOvr63s/SXLRb3sl6dopWehaKCIigdK1UERyUtbmumkVvalulRsMF2X++NG2Y4N+jt0+k8KvhSIiIvWkAVxEJFBqoZSsbrvEDyrEycaixFsKdW8l5NEqWPrc+23H9t+9OHNMdRBfl93UPHuyjlSBi4gEqpIKPNQqVNWmdBOvSJtLCutaiedRac7s3Z9wdE3GiOphw4Jjbce2VBBHWqrARUQCVfmJPKFW4yLdNKvx+Mk9darGQ6s0JZkqcBGRQGkAFxEJVOXLCJvtFLVSJHTxdkmzhRLSxKaERxW4iEigUlfg0TWTJ4F33X2dmV1G44L3Y8B/AF9x95NZA9HEplQhz7yOV9bNajtegbdObKoSl0H1U4HfA+yL3X8QeMjdVwJHgE15BiZSEuW1BCvtrvTLgC8Cj0T3DbgReDx6yjZgQxEBihRFeS2hS9tCeRj4GtC8WMJFwAfufjq6Pw0szSsoTWxKSQrL62Z7pNvEZl3XiEs4elbgZrYOOOzuP40fTniqd3j9ZjObNLPJU5zIGKZIvvLM65ljxwuJUaSXNBX4dcCXzOwWYD6wkEblssjM5kTVyjLgYNKL3X0CmABYaGOJPwydqBKXAuWW1/PGl3fM624Tm1piKIPqWYG7+wPuvszdVwB3AD9x97uAF4Bbo6dtBNqvjiNSU8prGQaDnMhzH7DdzL4OvAo8mk9I7bTEUEpUWF639sW7LTGMP1+kk74GcHffDeyObr8NXJN/SCLlUl5LqHQmpohIoCq/Fkq/NLEpoUuzxDD+uFop0okqcBGRQAVXgTdpYlNCp2unyKBUgYuIBEoDuIhIoIJtocRpYlNCp2unSBaqwEVEAjUUFXiTKnEJna6dIv1QBS4iEqihqsCbtMRQhkE/105RJT47qQIXEQmUBnARkUANZQslThObErq6LjEcWXV5Ke9TpiePj1YdQl9UgYuIBCpVBW5mB4CjwAxw2t1Xm9kYsANYARwAbnf3I8WEObi6VOLxCVapXki5XbclhvGq/6ywJ1O3vr6+6hD60k8F/vvufpW7r47u3w/scveVwK7ovkiIlNsSpEFaKOuBbdHtbcCGwcMRqQXltgQh7SSmA8+ZmQP/FO3Ifam7HwJw90NmdklRQeZJa8SlRZC5XYf9NYdx7flHUxdUHUJf0g7g17n7wSiRnzezn6d9AzPbDGwGmM/5GUIUKVSm3I7n9cjixUXGJ9JRqgHc3Q9GXw+b2RM0Nn19z8yWRBXKEuBwh9dOABMAC23M8wk7H3WZ2JTqZM3teF7PG19eWV5re7bZrWcP3MwWmNkFzdvATcB/AU8DG6OnbQSeKipIkSIotyV0aSrwS4EnzKz5/H9x9x+b2SvATjPbBEwBtxUXZrHUF5+1hia3+92eTYZDzwHc3d8GPpNw/H1gbRFBiZRBuS2h05mYIiKBGvprofRLE5sSujQTm0/++dlrfmxYcKzE6CRPqsBFRAKlCrwDVeISum4Tm+dc8+PT2RbZjE6113/dlinOHz/adiy0E2fqRhW4iEigVIH3kPfVA/up6HXlQslLa1/8o6mzlfJWOl+Br1uVvfDATMJj1vF7XbN0qu3Yi1OrAFXnWakCFxEJlAZwEZFAqYWSszwnPXt9L7VYpF9Jk4xzXroQgNGE53Vrk3y4YiThHTpPYr787njHx7q1V+LUajmXKnARkUCpAs+gLksL08ShKl2gfTIyXolnrbL7vbJht0q5W3Uep4nQc6kCFxEJlAZwEZFAqYXSQV3aJIPq9vdQeyV8ac+GbG2TxNdr59kmySptqyPrROiwtldUgYuIBCpVBW5mi4BHgE/R2AT2z4D9wA5gBXAAuN3djxQSZY6GpbLOg5YphpHbeZwN2V5ln62sQ9pmLetE6LBW52kr8H8Afuzuv0fjAvj7gPuBXe6+EtgV3RcJjXJbgtWzAjezhcD1wJ8AuPtJ4KSZrQduiJ62DdgN3FdEkP1SlZ2PYe+f1ym3s1bZaU+mCanKzqqI6hzaK/Q6VedpKvBPAr8G/tnMXjWzR6INYC9190MA0ddLkl5sZpvNbNLMJk9xIrfARXKQObfjeT1z7Hi5UYtE0gzgc4DPAt9x96uB4/TxK6W7T7j7andfPZd5GcMUKUTm3I7n9cjogiJjFOkozSTmNDDt7nui+4/TSPL3zGyJux8ysyXA4aKCTKI2SbWGpL1Sam7X4WzI2WqQs0BbWyx1ukZLzwrc3f8HeMfMLo8OrQXeAJ4GNkbHNgLZtvUQqYhyW0KX9kSevwQeM7PzgLeBP6Ux+O80s03AFHBb3sGpyg5TYNdoKSS3kyYl634yzWzVq1JOc52WpInQl2l/Xd5VeaoB3N1fA1YnPLQ212hESqbclpDpTEwRkUDV5looapfMLkn/3jVqqwwsaVKyG7VJ6itr2yPtJhWDUAUuIhIoc/fy3szs1zTW2v6mtDfN38cJN/6QY4fe8f+uu19cVjBNUV7/irA/35Bjh7DjTxN7Ym6XOoADmNmkuydNGgUh5PhDjh3qH3/d4+sm5Ngh7PgHiV0tFBGRQGkAFxEJVBUD+EQF75mnkOMPOXaof/x1j6+bkGOHsOPPHHvpPXAREcmHWigiIoEqdQA3s5vNbL+ZvWVmtd7lxMyWm9kLZrbPzPaa2T3R8TEze97M3oy+Lq461k7MbCS6zvUz0f3LzGxPFPuO6PoftWRmi8zscTP7efRvcG1dP/uQ8hqU21XLM7dLG8DNbAT4R+CPgCuBO83syrLeP4PTwBZ3vwJYA3w1ijek7bbuobFFWNODwENR7EeATZVElU4QW50FmNeg3K5afrnt7qX8Aa4Fno3dfwB4oKz3zyH+p4Av0Njwdkl0bAmwv+rYOsS7LEqEG4FnAKNxssCcpH+POv0BFgL/TTRHEzteu88+9LyOYlZulxd7rrldZgtlKfBO7P50dKz2zGwFcDWwh5RbydXAw8DXOLtB4kXAB+5+Orpf589/oG38ShZsXoNyuwK55naZA7glHKv9EhgzGwV+ANzr7h9WHU8aZrYOOOzuP40fTnhqXT//gbbxK1lIn+s5lNuVyDW3yxzAp4HlsfvLgIMlvn/fzGwujQR/zN1/GB1+L9pmiyq2kkvpOuBLZnYA2E7jV82HgUVm1rwCZZ0//6Stzj5LPT/74PIalNsVyjW3yxzAXwFWRrPF5wF30Ni6qpbMzIBHgX3u/u3YQ7XfbsvdH3D3Ze6+gsbn/BN3vwt4Abg1elotY4fgtjoLKq9BuV2l3HO75Ab+LcAvgF8CW6ueUOgR6+dp/Br2OvBa9OcWGv22XcCb0dexqmPt8fe4AXgmuv1J4GXgLeDfgHlVx9cl7quAyejzfxJYXNfPPqS8juJVblcbd265rTMxRUQCpTMxRUQCpQFcRCRQGsBFRAKlAVxEJFAawEVEAqUBXEQkUBrARUQCpQFcRCRQ/w8pe0YL+JBQewAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Turn spike indices into image\n",
"image = np.zeros(INPUT_SIZE * INPUT_SIZE)\n",
"image[spike_indices] = 1\n",
"image = np.reshape(image, (INPUT_SIZE, INPUT_SIZE))\n",
"\n",
"# Use OpenCV to calculate convolution\n",
"cv_out = cv2.filter2D(image, cv2.CV_64F, filt)\n",
"\n",
"# Show results\n",
"fig, axes = plt.subplots(1, 2)\n",
"axes[0].imshow(image)\n",
"axes[1].imshow(cv_out)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Toeplitz approach"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1152x144 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x864 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Zero pad filter to output size\n",
"zero_pad_filt = np.pad(filt, ((OUTPUT_SIZE - filt.shape[0], 0), (0, OUTPUT_SIZE - filt.shape[1])), \n",
" \"constant\", constant_values=0.0)\n",
"\n",
"# Flip rows\n",
"zero_pad_filt = np.flipud(zero_pad_filt)\n",
"\n",
"# Build list of toeplitz matrices\n",
"f_matrices = []\n",
"for i in range(zero_pad_filt.shape[0]):\n",
" toeplitz_col = zero_pad_filt[i]\n",
" toeplitz_row = np.concatenate(((toeplitz_col[0],), np.zeros(INPUT_SIZE - 1)))\n",
" f_matrices.append(toeplitz(toeplitz_col, toeplitz_row))\n",
"\n",
"# Show some of the submatrices\n",
"fig, axes = plt.subplots(1, 3, figsize=(16,2), sharey=True)\n",
"axes[0].imshow(f_matrices[0])\n",
"axes[0].set_title(\"F0\")\n",
"axes[1].imshow(f_matrices[1])\n",
"axes[1].set_title(\"F1\")\n",
"axes[2].imshow(f_matrices[2])\n",
"axes[2].set_title(\"F2\")\n",
"\n",
"# doubly blocked toeplitz indices: \n",
"# this matrix defines which toeplitz matrix from toeplitz_list goes to which part of the doubly blocked\n",
"block_toeplitz_col = list(range(1, zero_pad_filt.shape[0] + 1))\n",
"block_toeplitz_row = np.concatenate(((block_toeplitz_col[0],), np.zeros(INPUT_SIZE - 1, dtype=int)))\n",
"block_indices = toeplitz(block_toeplitz_col, block_toeplitz_row)\n",
"\n",
"## creat doubly blocked matrix with zero values\n",
"toeplitz_shape = f_matrices[0].shape # shape of one toeplitz matrix\n",
"\n",
"doubly_blocked = np.zeros((toeplitz_shape[0] * block_indices.shape[0], \n",
" toeplitz_shape[1] * block_indices.shape[1]))\n",
"\n",
"# tile toeplitz matrices for each row in the doubly blocked matrix\n",
"for i in range(block_indices.shape[0]):\n",
" for j in range(block_indices.shape[1]):\n",
" start_i = i * toeplitz_shape[0]\n",
" start_j = j * toeplitz_shape[1]\n",
" end_i = start_i + toeplitz_shape[0]\n",
" end_j = start_j + toeplitz_shape[1]\n",
" doubly_blocked[start_i: end_i, start_j:end_j] = f_matrices[block_indices[i,j] - 1]\n",
"\n",
"fig, axis = plt.subplots(figsize=(12,12))\n",
"axis.imshow(doubly_blocked)\n",
"axis.set_title(\"Doubly-blocked matrix\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Standard matrix multiply by Toeplitz"
]
},
{
"cell_type": "code",
"execution_count": 171,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"\n",
"# Perform matrix-vector multiplication\n",
"dense_result = doubly_blocked.dot(image.flatten())\n",
"\n",
"fig, axis = plt.subplots()\n",
"axis.imshow(np.reshape(dense_result, (OUTPUT_SIZE, OUTPUT_SIZE)))\n",
"axis.set_title(\"Result\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sparse, spiking approach"
]
},
{
"cell_type": "code",
"execution_count": 182,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Result')"
]
},
"execution_count": 182,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"output = np.zeros((OUTPUT_SIZE * OUTPUT_SIZE))\n",
"\n",
"# Loop through spikes\n",
"for pre in spike_indices:\n",
" # Determine which column of blocks contains pre\n",
" j = pre // INPUT_SIZE\n",
" col = pre % INPUT_SIZE\n",
" \n",
" # Rotate row of zero-padded filter corresponding to each block and concatenate together\n",
" col_test = np.concatenate([np.pad(zero_pad_filt[block_indices[i, j] - 1], (col, 0))[:OUTPUT_SIZE]\n",
" for i in range(block_indices.shape[0])])\n",
" assert np.array_equal(doubly_blocked[:,pre], col_test)\n",
" \n",
" # Add to output\n",
" output += col_test\n",
"\n",
"fig, axis = plt.subplots()\n",
"axis.imshow(np.reshape(output, (OUTPUT_SIZE, OUTPUT_SIZE)))\n",
"axis.set_title(\"Result\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment