{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Matrix Multiplication\n", "\n", "This notebook has been translated from [ImageJ Macro](https://clij.github.io/clij2-docs/md/matrix_multiply/)\n", "\n", "It shows how to perform a matrix multiplication in the GPU.\n", "\n", "## Initialize GPU" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Used GPU: Intel(R) Iris(R) Xe Graphics\n" ] } ], "source": [ "import pyclesperanto_prototype as cle\n", "\n", "from skimage.io import imread, imsave, imshow\n", "import matplotlib\n", "import numpy as np\n", "\n", "# initialize GPU\n", "cle.select_device(\"GTX\")\n", "print(\"Used GPU: \" + cle.get_device().name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define two arrays (vectors) and push them to the GPU" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "array1 = np.asarray([[1, 2, 3, 4, 5]])\n", "array2 = np.asarray([[6, 7, 8, 9, 10]])\n", "\n", "vector1 = cle.push(array1)\n", "vector2 = cle.push(array2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## In order to multiplicate matrices, the input matrices must be of size (n * m) and (m * n)\n", "Therefore, we transpose one of our vectors:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vector 1 (transposed): [[1.]\n", " [2.]\n", " [3.]\n", " [4.]\n", " [5.]]\n", "Vector 2: [[ 6. 7. 8. 9. 10.]]\n" ] } ], "source": [ "vector1_t = cle.transpose_xy(vector1)\n", "\n", "print(\"Vector 1 (transposed): \" + str(vector1_t))\n", "print(\"Vector 2: \" + str(vector2))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 6. 7. 8. 9. 10.]\n", " [12. 14. 16. 18. 20.]\n", " [18. 21. 24. 27. 30.]\n", " [24. 28. 32. 36. 40.]\n", " [30. 35. 40. 45. 50.]]\n" ] } ], "source": [ "matrix = cle.create([vector1_t.shape[0], vector2.shape[1]])\n", "cle.multiply_matrix(vector1_t, vector2, matrix)\n", "\n", "print(matrix)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "cle.imshow(matrix)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Element by element multiplication of two matrices" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 3.514832 4.0798674 6.8832116 2.4485908 2.1087325]\n", " [11.203639 11.765139 12.340768 17.706673 19.63089 ]\n", " [13.040122 18.359781 5.621809 11.222803 26.120459 ]\n", " [ 7.7386 14.522078 21.716482 5.263441 5.4148645]\n", " [25.103271 18.912039 35.608345 41.090908 14.199609 ]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# generate another matrix of the same size with random values\n", "another_matrix = cle.push_zyx(np.random.random(matrix.shape))\n", "\n", "# element by element multiplication\n", "matrix_element_wise_multiplied = cle.multiply_images(matrix, another_matrix)\n", "\n", "print(matrix_element_wise_multiplied)\n", "\n", "cle.imshow(matrix_element_wise_multiplied)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Element by element multiplication of a matrix with a scalar" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 12. 14. 16. 18. 20.]\n", " [ 24. 28. 32. 36. 40.]\n", " [ 36. 42. 48. 54. 60.]\n", " [ 48. 56. 64. 72. 80.]\n", " [ 60. 70. 80. 90. 100.]]\n" ] } ], "source": [ "elements_times_2 = cle.multiply_image_and_scalar(matrix, scalar=2)\n", "print(elements_times_2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.13" } }, "nbformat": 4, "nbformat_minor": 4 }