From 0112a0b37839cfe044ccf99a80f3488889895206 Mon Sep 17 00:00:00 2001 From: hhakim <hakim.hadj-djilani@inria.fr> Date: Sat, 16 Jan 2021 12:07:31 +0100 Subject: [PATCH] Update livescript to fill section 1.3 and set internal links (of toc). --- gen_doc/Faust_manipulation.mlx | Bin 28128 -> 76544 bytes gen_doc/Faust_manipulation.mlx.html | 423 +++++++++++++++------------- 2 files changed, 220 insertions(+), 203 deletions(-) mode change 100644 => 100755 gen_doc/Faust_manipulation.mlx mode change 100644 => 100755 gen_doc/Faust_manipulation.mlx.html diff --git a/gen_doc/Faust_manipulation.mlx b/gen_doc/Faust_manipulation.mlx old mode 100644 new mode 100755 index 5f0814fe64e575e01801d5a698f60d17f987c067..262da1263ac2de3e87cdc8d45be693a54cf7fd46 GIT binary patch delta 59027 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 delta 10246 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 BTJrz^ diff --git a/gen_doc/Faust_manipulation.mlx.html b/gen_doc/Faust_manipulation.mlx.html old mode 100644 new mode 100755 index f96c4044d..57dc7d31c --- a/gen_doc/Faust_manipulation.mlx.html +++ b/gen_doc/Faust_manipulation.mlx.html @@ -5,8 +5,8 @@ .S3 { margin: 10px 0px 20px; padding-left: 0px; font-family: Helvetica, Arial, sans-serif; font-size: 14px; } .S4 { margin-left: 56px; line-height: 21px; min-height: 0px; text-align: left; white-space: pre-wrap; } .CodeBlock { background-color: #F7F7F7; margin: 10px 0 10px 0;} -.S5 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 4px 4px 0px 0px; padding: 6px 45px 4px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } -.S6 { color: rgb(64, 64, 64); padding: 10px 0px 6px 17px; background: rgb(255, 255, 255) none repeat scroll 0% 0% / auto padding-box border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; overflow-x: hidden; line-height: 17.234001159668px; } +.S5 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 4px 4px 0px 0px; padding: 6px 45px 4px 13px; line-height: 17.2339992523193px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } +.S6 { color: rgb(64, 64, 64); padding: 10px 0px 6px 17px; background: rgb(255, 255, 255) none repeat scroll 0% 0% / auto padding-box border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; overflow-x: hidden; line-height: 17.2339992523193px; } .embeddedOutputsErrorElement {min-height: 18px; max-height: 250px; overflow: auto;} .embeddedOutputsErrorElement.inlineElement {} .embeddedOutputsErrorElement.rightPaneElement {} @@ -26,7 +26,7 @@ .inlineElement .textElement {} .embeddedOutputsTextElement.rightPaneElement,.embeddedOutputsVariableStringElement.rightPaneElement {min-height: 16px;} .rightPaneElement .textElement {padding-top: 2px; padding-left: 9px;} -.S7 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 0px; padding: 6px 45px 4px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } +.S7 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 0px; padding: 6px 45px 4px 13px; line-height: 17.2339992523193px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } .variableValue { width: 100% !important; } .embeddedOutputsMatrixElement,.eoOutputWrapper .matrixElement {min-height: 18px; box-sizing: border-box;} .embeddedOutputsMatrixElement .matrixElement,.eoOutputWrapper .matrixElement,.rtcDataTipElement .matrixElement {position: relative;} @@ -53,74 +53,83 @@ .matrixElement .horizontalEllipsis,.rtcDataTipElement .matrixElement .horizontalEllipsis {display: inline-block; margin-top: 3px; width: 30px; height: 12px; background-repeat: no-repeat; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAJCAYAAADO1CeCAAAAJUlEQVR42mP4//8/A70xw0i29BUDFPxnAEtTW37wWDqakIa4pQDvOOG89lHX2gAAAABJRU5ErkJggg==");} .matrixElement .verticalEllipsis,.textElement .verticalEllipsis,.rtcDataTipElement .matrixElement .verticalEllipsis,.rtcDataTipElement .textElement .verticalEllipsis {margin-left: 35px; width: 12px; height: 30px; background-repeat: no-repeat; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAZCAYAAAAIcL+IAAAALklEQVR42mP4//8/AzGYgWyFMECMwv8QddRS+P//KyimlmcGUOFoOI6GI/UVAgDnd8Dd4+NCwgAAAABJRU5ErkJggg==");} .S8 { margin: 10px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre-wrap; color: rgb(0, 0, 0); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: normal; text-align: left; } -.S9 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 0px none rgb(0, 0, 0); border-radius: 4px 4px 0px 0px; padding: 6px 45px 0px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } -.S10 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 0px none rgb(0, 0, 0); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 0px; padding: 0px 45px 4px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } -.S11 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 0px none rgb(0, 0, 0); border-bottom: 0px none rgb(0, 0, 0); border-radius: 0px; padding: 0px 45px 0px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } +.S9 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 0px none rgb(0, 0, 0); border-radius: 4px 4px 0px 0px; padding: 6px 45px 0px 13px; line-height: 17.2339992523193px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } +.S10 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 0px none rgb(0, 0, 0); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 0px; padding: 0px 45px 4px 13px; line-height: 17.2339992523193px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } +.S11 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 0px none rgb(0, 0, 0); border-bottom: 0px none rgb(0, 0, 0); border-radius: 0px; padding: 0px 45px 0px 13px; line-height: 17.2339992523193px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } .S12 { margin: 10px 10px 5px 4px; padding: 0px; line-height: 18px; min-height: 0px; white-space: pre-wrap; color: rgb(60, 60, 60); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 15px; font-weight: bold; text-align: left; } -.S13 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 4px; padding: 6px 45px 4px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } -.S14 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 0px none rgb(0, 0, 0); border-radius: 0px; padding: 6px 45px 0px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } -.S15 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 0px 0px 4px 4px; padding: 6px 45px 4px 13px; line-height: 17.234001159668px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; }</style></head><body><div class = rtcContent><div class = 'S0'></div><h2 class = 'S1'><span>How to Manipulate a Faust</span></h2><div class = 'S0'><span></span></div><div class = 'S0'><span>This livescript is intended to gently introduce the operations available to manipulate a Faust object. It comes after the first livescript (available </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_creation.mlx"><span>here</span></a><span> for download or </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_creation.html"><span>here</span></a><span> as a web page), so it's assumed you already know how to create a Faust object from one way or another.</span></div><div class = 'S0'><span>Keep in mind that a full API doc is available </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/namespacematfaust.html"><span>here</span></a><span> every time you need details. In particular the Faust class is documented </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html"><span>here</span></a><span>.</span></div><div class = 'S0'><span style=' font-weight: bold;'>NOTE</span><span>: the livescript is made to be executed sequentially, otherwise, skipping some cells, you would end up on an import error.</span></div><div class = 'S0'><span></span></div><h3 class = 'S2'><span>Table of Contents:</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>1. Getting Basic Information about a Faust Object</span></div><div class = 'S0'><span>1.1 Obtaining Dimension and Scalar Type Information</span></div><div class = 'S0'><span>1.2 Obtaining Other Faust Specific Information</span></div><div class = 'S0'><span>1.3 Plotting a Faust</span></div><div class = 'S0'><span>1.4 About Sparsity!</span></div><div class = 'S0'><span>2. Faust Algebra and other Operations</span></div><div class = 'S0'><span>2.1 Transpose, conjugate, transconjugate</span></div><div class = 'S0'><span>2.2 Add, Subtract and Multiply</span></div><div class = 'S0'><span>2.3 Faust Multiplication by a Vector or a Matrix</span></div><div class = 'S0'><span>2.4 Faust Norms</span></div><div class = 'S0'><span>2.5 Faust Normalizations</span></div><div class = 'S0'><span>2.6 Faust Concatenation</span></div><div class = 'S0'><span>2.7 Faust Indexing and Slicing</span></div><div class = 'S0'><span></span></div><h3 class = 'S2'><span>1. Getting Basic Information about a Faust Object</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>First of all, given any object, you might ask yourself if it's a Faust or not (typically when you receive an object in a function, matlab being built on dynamic types, you can't say for sure it's a Faust). </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#ac5d5fbe66ef212a1c7043b78504f87fc"><span>Faust.isFaust()</span></a><span> is the function to verify an object is a Faust. Its use is straighforward as you can see in the documentation. Note by the way, that a more accessible alias is available at the package root </span><span style=' font-family: monospace;'>(matfaust.isFaust</span><span>).</span></div><div class = 'S0'><span></span></div><h3 class = 'S2'><span>1.1 Obtaining Dimension and Scalar Type Information</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>Firstly, let's list basic Faust informative methods/attributes you're probably used to for matlab matrices:</span></div><ul class = 'S3'><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a7146c7de95b35efc570a377765edda27"><span>size</span></a><span>,</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#af62f554cd8b491a2c75ee06019f87d8a"><span>numel</span></a><span>,</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a7527e1fda21bc1678646a4b40db28eb6"><span>isreal</span></a><span>.</span></li></ul><div class = 'S0'><span>To keep it really clear, let's show some examples operated on a random Faust.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F = matfaust.rand(5,10)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="966668C8" data-scroll-top="null" data-scroll-left="null" data-testid="output_0" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">F = </span></div><div>Faust size 5x10, density 3.7, nnz_sum 185, 5 factor(s): -- FACTOR 0 (real) SPARSE, size 5x10, density 0.5, nnz 25 -- FACTOR 1 (real) SPARSE, size 10x6, density 0.666667, nnz 40 -- FACTOR 2 (real) SPARSE, size 6x9, density 0.555556, nnz 30 -- FACTOR 3 (real) SPARSE, size 9x9, density 0.555556, nnz 45 -- FACTOR 4 (real) SPARSE, size 9x10, density 0.5, nnz 45</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>size(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="253C2C58" data-scroll-top="null" data-scroll-left="null" data-testid="output_1" data-width="926" style="width: 956px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 926px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">1×2</span></div><div class="valueContainer" data-layout="{"columnWidth":44,"totalColumns":2,"totalRows":1,"charsPerColumn":6}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 90px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 5 10 -</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>numel(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 50</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>isreal(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="B36889E1" data-scroll-top="null" data-scroll-left="null" data-testid="output_3" data-width="926" data-height="34" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 -</div></div></div></div></div></div><div class = 'S8'><span>If the attributes printed out above seem not clear to you, you're probably not a Matlab user. Anyway you'll find all descriptive informations in the FAµST API documentation (see the links above).</span></div><div class = 'S0'><span>As a complement, you can also refer to the Matlab API documentation:</span></div><ul class = 'S3'><li class = 'S4'><a href = "https://www.mathworks.com/help/matlab/ref/size.html"><span>size</span></a></li><li class = 'S4'><a href = "https://www.mathworks.com/help/matlab/ref/numel.html"><span>numel</span></a></li><li class = 'S4'><a href = "https://www.mathworks.com/help/matlab/ref/isreal.html"><span>isreal</span></a></li></ul><div class = 'S0'><span>About size, it's noteworthy that contrary to what Matlab is capable of on an array, you cannot </span><a href = "https://www.mathworks.com/help/matlab/ref/reshape.html"><span>reshape</span></a><span> a Faust.</span></div><h3 class = 'S2'><span></span></h3><h3 class = 'S2'><span>1.2 Obtaining Other Faust Specific Information</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>As you've seen in this livescript and the first one, when you print a Faust object, several pieces of information appear. Most of them are also available independently with specific functions.</span></div><div class = 'S0'><span>For instance, if you want information about factors, nothing is more simple than calling directly the next functions:</span></div><ul class = 'S3'><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a5e77419460592366457aa60175472e2e"><span>numfactors()</span></a><span> ; which gives you the number of factors (aka layers) a Faust object is composed of.</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a65a84416b4b1fd050654a02232e95d2f"><span>factors()</span></a><span> ; which allows you to copy any of the Faust's factors givens its index.</span></li></ul><div class = 'S0'><span>Going back to our F object, let's call these functions:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>numfactors(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 5</div></div></div></div><div class = 'S8'><span>For example, try to copy the third factor:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>f3 = factors(F, 3)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="5FE9FC04" data-scroll-top="null" data-scroll-left="null" data-testid="output_5" data-width="926" data-height="440" data-hashorizontaloverflow="false" style="width: 956px; max-height: 451px;"><div class="textElement"><div><span class="variableNameElement">f3 = </span></div><div> (1,1) 0.4445 - (2,1) 0.7386 - (3,1) 0.8996 - (5,1) 0.7525 - (6,1) 0.3492 - (5,2) 0.8700 - (6,2) 0.0345 - (1,3) 0.1148 - (2,3) 0.9154 - (3,3) 0.1409 - (5,3) 0.3150 - (6,3) 0.0677 - (1,4) 0.0300 - (2,4) 0.0864 - (3,4) 0.0184 - (4,4) 0.8315 - (1,5) 0.3195 - (3,5) 0.6342 - (4,5) 0.5401 - (5,5) 0.7264 - (1,6) 0.0206 - (6,6) 0.4736 - (2,7) 0.6442 - (4,7) 0.8710 - (5,7) 0.2015 - (2,8) 0.6851 - (4,8) 0.1751 - (3,9) 0.5870 - (4,9) 0.2351 - (6,9) 0.2876 -</div></div></div></div></div></div><div class = 'S8'><span>Note that, since Faust 2.3, the function doesn't alterate the factor format. If the Faust object contains a sparse factor then you'll receive a sparse matrix.</span></div><div class = 'S0'><span>Since Faust 2.3 again, it's possible to retrieve a sub-sequence of Faust factors.</span></div><div class = 'S0'><span>Go straight to the example, extracting factors from F:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>factors(F, 3:4)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="F02A29A9" data-scroll-top="null" data-scroll-left="null" data-testid="output_6" data-width="926" data-height="62" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 6x9, density 1.38889, nnz_sum 75, 2 factor(s): -- FACTOR 0 (real) SPARSE, size 6x9, density 0.555556, nnz 30 -- FACTOR 1 (real) SPARSE, size 9x9, density 0.555556, nnz 45</div></div></div></div></div></div><div class = 'S8'><span>Hmm... something is different from the previous example. We indeed received a Faust as return type, great! You've just learned another way to create a Faust from another, additionally to what you've seen in the first </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_manipulation.html"><span>livescript</span></a><span>.</span></div><div class = 'S0'><span>Without this function, you'd surely have written something similar to:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>import </span><span style="color: rgb(160, 32, 240);">matfaust.Faust</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>Faust({factors(F, 3), factors(F, 4)})</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="5F503923" data-scroll-top="null" data-scroll-left="null" data-testid="output_7" data-width="926" data-height="62" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 6x9, density 1.38889, nnz_sum 75, 2 factor(s): -- FACTOR 0 (real) SPARSE, size 6x9, density 0.555556, nnz 30 -- FACTOR 1 (real) SPARSE, size 9x9, density 0.555556, nnz 45</div></div></div></div></div></div><div class = 'S8'><span>OK, that's not awful but I let you imagine how much complicated it is with more factors.</span></div><div class = 'S0'><span></span></div><h3 class = 'S2'><span>1.3 Plotting a Faust</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>Available soon!</span></div><div class = 'S0'><span></span></div><h3 class = 'S2'><span>1.4 About Sparsity!</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>Three functions of the Faust class are here to evaluate the sparsity of a Faust object.</span></div><div class = 'S0'><span>Let's call the first one:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>nnz_sum(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 185</div></div></div></div><div class = 'S8'><span>I'm sure you guessed exactly what the function returns, if you doubt it, here is the doc: </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a7dc7f3cb86b02b3c2cd725387c34300d"><span>Faust.nnz_sum()</span></a><span>. The smaller </span><span style=' font-family: monospace;'>nnz_sum</span><span>, the sparser the Faust.</span></div><div class = 'S0'><span>Next comes the function: </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#ac33ff53bbff16f93666acec05031511b"><span>Faust.density()</span></a><span>.</span></div><div class = 'S0'><span>This function along with its reciprocal </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#aff3261319b63c49d51a699726edc74bc"><span>Faust.rcg()</span></a><span> can give you a big hint on how much your Faust is potentially optimized both for storage and calculation. The sparser the Faust, the larger the Relative Complexity Gain (RCG)!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>density(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 3.7000</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>rcg(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.2703</div></div></div></div><div class = 'S8'><span>According to its RCG, this Faust doesn't seem to be of any help for optimization but look at the graphic the next script generates:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>nfactors = 3;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>startd = 0.01;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>endd = 1;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>dim_sz = 1000;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>ntests = 10;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>sizes = zeros(ntests, 1);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>rcs = zeros(ntests, 1);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>densities = linspace(startd, endd, ntests);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">for </span><span>i=1:ntests</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> d = densities(i);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> F = matfaust.rand(dim_sz, dim_sz, </span><span style="color: rgb(160, 32, 240);">'num_factors'</span><span>, nfactors, </span><span style="color: rgb(160, 32, 240);">'density'</span><span>, d, </span><span style="color: rgb(160, 32, 240);">'fac_type'</span><span>, </span><span style="color: rgb(160, 32, 240);">'sparse'</span><span>);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> sizes(i) = nbytes(F);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> rcs(i) = density(F);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">end</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>plot(rcs, sizes)</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>legend(</span><span style="color: rgb(160, 32, 240);">'size'</span><span>)</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>xlabel(</span><span style="color: rgb(160, 32, 240);">'Density'</span><span>)</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>ylabel(</span><span style="color: rgb(160, 32, 240);">'Faust Size (bytes)'</span><span>)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsFigure" uid="234B7E16" data-scroll-top="null" data-scroll-left="null" data-testid="output_11" style="width: 956px;"><div class="figureElement"><div class="figureContainingNode" style="width: 560px; max-width: 100%; display: inline-block;"><div class="GraphicsView" data-dojo-attach-point="graphicsViewNode,backgroundColorNode" id="uniqName_197_0" widgetid="uniqName_197_0" style="width: 100%; height: auto;"><img class="ImageView figureImage" data-dojo-attach-point="imageViewNode" draggable="false" ondragstart="return false;" id="uniqName_197_2" widgetid="uniqName_197_2" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAYAAAAv7h+nAAAgAElEQVR4AezBD3zfBWHn/1c+tW3GY5LMzeiw36yDC2/dco+ctmwk3V1cRaSij8hJogUNYAHB6yM9UkCGtEg7fZyyfrfmwQmbMLxwjxUTTom4Q71bNcwkCC0uDzO3t+F81KRDDP+SutEUbPv79e7BHXOi/G3zTd7PZ3E4IiIiosIURERERFSYgoiIiIgKUxARERFRYQoiIiIiKkxBRERERIUpiIiIiKgwBREREREVpiAiIiKiwhREREREVJiCiIiIiApTEBEREVFhCiIiIiIqTEFEREREhSmIiIiIqDAFERERERWmICIiIqLCFMRR95d/+Zds3bqVrVu3snXrVvbv309EREQ8fwVx1P27f/fvuOSSS+js7GRmZobq6moiIiLi+SuIo+7Vr341r33ta7n99tvp6uqiqqqKiIiIeP4K4pgYHx/nJz/5CfX19URERMQLUxAvm8HBQf7oj/6IZ/vUpz5FR0cH73//+/mbv/kbnnHHHXfwnve8h4iIiHjhCuIlm5mZ4eqrr+ayyy7jqaee4hnf+ta3+Lu/+ztuv/12rr32Wq699lqe8Xd/93e88Y1vJCIiIl64gnhedu3axejoKM/42te+xuTkJEccd9xxnHvuuVx22WU823333ceaNWsoioI3velNPPXUU+zbt48jent7WbRoEREREfHCFcTzsnLlSn74wx8yOjrK1772NV73utdRKpU4YvHixfz2b/829fX1PNvMzAy1tbU841d+5VfYt28fERER8dIUxPN2xhlnsHPnTh577DGampr4RZYsWcKBAwd4xuzsLEuWLCEiIiJemoJ43r7yla+wevVqXvva1zI6Osov8sY3vpH77ruPIx577DGeeOIJfu3Xfo2IiIh4aQrieXnggQf49V//dZqamjjttNN45JFHmJyc5OdZs2YNP/rRj+js7OQDH/gAl19+OUVREBERES9NQXDw4EHWrl2LbZ7LW97yFpqamnjGaaedRqlU4tlaW1u5+uqrecbixYv57Gc/y2c+8xm+/OUvc+aZZxIREREvXUHwn//zf2bfvn0cOnSIV8Iv//Ivs2jRIiIiIuLlUbDAPfDAAzz11FP8m3/zb4iIiIjKULCA/dM//RM333wzXV1d/Dytra1IQhKSkIQkJCEJSUhCEpKQ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kdbWVu6++25OOeUUNm3axBE33ngj7373u/nLv/xLfu/3fo/e3l4CCiIiIhaQvs5GDm9bzeFtqzm8bTWHt63m8LbVHN62msPbVnN422oOb1vN4W2rObxtNYe3rebwttUc3raaw9tWc3jbag5vW83hbas5vG01h7et5vC21RzetprD21ZzeNtqDm9bzeFtqzm8bTWHt63m8LbV9HU28oyuri6+9KUv0dzczMzMDIcPH+YZX/rSl/jHf/xH1q5dyxF/8zd/ww033MCaNWvo6+vjkUceIaAgIiIijqp7772XP/uzP+Oee+7hnnvu4bvf/S5H/OhHP+Kmm27i+uuv5xknnngiH/vYx7j77rvZtm0bb3/72wkoiIiIiKNqyZIlnHXWWaxfv57Fixdz0kknccRtt93Gvn37WLt2LWeffTaPPPIIH/nIR9i2bRsXXHABmzdv5uSTTyagICIiIo6q97znPfzVX/0Vf/qnf8p//+//nerqai644AK++93v8s1vfpM77riDO+64g9e+9rW87nWv46tf/Sq33norAwMD1NTUEFAQERERUWEKIiIiIipMQURExDz2+te/HklIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPH617+ehaggIiJiHhscHMQ2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9sMDg6yEBVEREREVJiCiIiIiApTEBEREVFhCiIiIiIqTEFEREREhSmIiIiIqDAFERERERWmICIiIqLCFERERERUmIKIiIiIClMQERER81L/6BTff9snmZyeZb4piIiIiHmno3eM7oFxSkOfplRbzXxTEBEREfPGyJ4ZSluGWFazlMnNq1g8O818VBARERHzQvfAOB29Y5TbGii3NTCfFURERERFm5yepblnF3tnDjDctYL2pjrmu4KIiIioWP2jU9RvHaa9qY6+zkZKtdUsBAXz2MGDB7n66qt53/vex/ve9z5s89MuvPBC1q5dy9q1a7n++uuJiIioBJPTs3T0jtE9MM7Epha6W+tZSArmsa9+9assWbKEz3/+85x//vn8yZ/8Cc+2f/9+Dh48yI4dO9ixYwdXXHEFERERc93InhlaenazrGYpk5tXUaqtZqEpmMde//rXc/7553PE8ccfz3HHHcezfe973+OEE05gYGCAwcFBDh06xHORhCQksWHDBiIiIo6F7oFxOnrHKLc1UG5r4Kdt2LABSUhCEvNVwTz2lre8heXLl/OpT32KK6+8knPPPZdne+ihh3jsscdYsmQJX//617nyyit5LraxjW22b99ORETE0TQ5PUtzzy72zhxguGsF7U11/Czbt2/HNraxzXxVMI/t27ePgwcP8tGPfpS77rqLq666ioMHD/KMNWvWcNNNN7FmzRo+/vGP8+1vf5sDBw4QERExl/SPTlG/dZj2pjr6Ohsp1Vaz0BXMY+VymTvvvJMjjjvuOJ5++mkOHTrEwYMHefzxx7n55pvZuXMnR/z4xz/m0KFDLF68mIiIiLlgcnqWjt4xugfGmdjUQndrPfF/FMxjF110Ebfddhvr1q3jnHPOYf369SxevJjvf//7nH766bzzne/kxhtvZP369VxwwQVs2rSJoiiIiIg41kb2zNDSs5tlNUuZ3LyKUm018f8UzGNveMMbuPPOO7nlllv4whe+wHvf+16OaGhoYNeuXZxwwgn09/dzww03cMcdd7B69WoiIiKOte6BcTp6x+jrbKTc1kD8SwURERExJ0xOz1LaMsTemQMMd62geXkN8bMVRERExDFXHpygfusw5bYG+jobKdVWE8+tICIiIo6ZyelZOnrH6B+dYmJTC+1NdcQvVhARERHHRP/oFC09u1lWs5SRrpWUaquJ56cgIiIijrrugXG6B8bp62yk3NZAvDAFERERcdRMTs9S2jLE3pkDDHetoHl5DfHCFURERMRRUR6coH7rMOW2Bvo6GynVVhMvTkFERES8oianZ+noHaN/dIqJTS20N9URL01BREREvGL6R6do6dnNspqljHStpFRbTbx0BREREfGK6B4Yp3tgnL7ORsptDcTLpyAiIiJeVpPTs5S2DLF35gCTm1fRvLyGeHkVRERExMumPDhBS89uym0N9HU2Eq+MgoiIiHjJJqdnae7ZRf/oFMNdK2hvqiNeOQURERHxkvSPTtHSs5v2pjpGulZSqq0mXlkFERER8aJ19I7RPTBOX2cj3a31xNFREBERES/YyJ4ZSluGOGJy8yqal9cQR09BREREvCDlwQk6esco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84Mf/IBvfvObjIyM8Mgjj/CLnHPOORxx8skn88QTT/Bs3/ve9zjhhBMYGBhgcHCQQ4cO8VwkIQlJbNiwgYiIuag8OEFH7xjltgb6OhuJhWfDhg1IQhKSmK8KKsDs7Cy33HILZ5xxBhdeeCE333wzt956K+eddx6///u/z2c+8xn279/PT3vXu95FU1MT+/fv55prrqGzs5Nne+ihh3jsscdYsmQJX//617nyyit5LraxjW22b99ORMRcMjk9S3PPLvpHpxjuWkF7Ux2xMG3fvh3b2MY281XBHPf0009zySWXUF1dzRe/+EX+x//4H3zuc5/jxhtv5HOf+xz/83/+T0qlEhs2bOBHP/oRP+2ee+7hoosuYs2aNZx33nk825o1a7jppptYs2YNH//4x/n2t7/NgQMHiIioJP2jU7T07Ka9qY6RrpWUaquJmO8K5rhXvepV3HrrrZx77rns2bOHc845h0OHDvH+97+ftrY2tmzZwrvf/W7+7M/+jNe+9rU827333svtt9/OZz/7WU477TSecfDgQR5//HFuvvlmdu7cyRE//vGPOXToEIsXLyYiolJ09I7RPTBOX2cj3a31RCwUBXNcVVUVVVVVHNHT08PFF1/M6Ogoxx13HMPDw3znO99h//79HFEUBc/W19fH5OQkF198MR/84Afp7u7miO9///ucfvrpvPOd7+TGG29k/fr1XHDBBWzatImiKIiImOtG9sxQ2jLEEZObV9G8vIaIhaSggjzyyCOceuqp3HfffbztbW+jqqqK448/nieffJKfpVwuc9ddd3Hbbbdx2223US6XOaKhoYFdu3Zxwgkn0N/fzw033MAdd9zB6tWriYiY68qDE3T0jlFua6Cvs5GIhaiggjQ1NXHdddexY8cO3vrWt/KVr3yFRx55hNe85jVERMx3k9OzNPfson90iuGuFbQ31RGxUBVUkMsvv5yTTz6ZT37yk9TX1/PDH/6QG264gaqqKiIi5rP+0SlaenbT3lTHSNdKSrXVRCxkBRXkl37pl/id3/kdvvnNbzI0NMSb3vQmfuM3foOIiPmso3eM7oFx+job6W6tJyKgoILs3LmTTZs2MTU1xYMPPsgDDzzAlVdeSUTEfDSyZ4bSliGW1SxlcvMqmpfXEBH/R0EFuf322+np6eHUU0+lqqqKj3zkIzz00EPMzs4SETGfdA+M09E7RrmtgXJbAxHxzxVUkKIoOHToEM84dOgQ+/btY9GiRUREzAeT07M09+xi78wBhrtW0N5UR0T8SwUV5EMf+hBdXV389V//Nbt27WL9+vWceuqpLF68mIiIStc/OkX91mHam+ro62ykVFtNRPxsBRXkxBNP5M4776ShoYFly5Zx9tlnc+GFFxIRUckmp2fp6B2je2CciU0tdLfWExE/X0EFufbaa5mYmGD9+vVceeWVvPWtb6Wzs5OIiEo1smeGlp7dLKtZyuTmVZRqq4mIX6ygAgwMDHDKKafwjW98g7POOotTTjmFU045hVNPPZUTTzyRiIhK1D0wTkfvGOW2BsptDUTE81dQAdra2rj//vtpa2vjrrvu4v777+f+++/nvvvu46abbiIiopJMTs/S3LOLvTMHGO5aQXtTHRHxwhRUkA984AP82q/9GhERlap/dIr6rcO0N9XR19lIqbaaiHjhCirIPffcwzve8Q7+8A//kL//+78nIqJSTE7P0tE7RvfAOBObWuhurSciXryCCnLJJZdw9913c8opp/CZz3yGc845h7/4i79g3759RETMVSN7Zmjp2c2ymqVMbl5FqbaaiHhpCipMdXU1p512Gu3t7dTW1nLbbbdxzjnn8OlPf5rDhw8TETGXdA+M09E7Rl9nI+W2BiLi5VFQQf7+7/+eT3ziE5x22mkMDAxwwQUXcPfdd/OlL32JBx98kNHRUSIi5oLJ6Vmae3axd+YAw10raF5eQ0S8fAoqyJe//GWWLVvG17/+da655hpOOeUUjiiKgksvvZTly5cTEXGslQcnqN86THdrPX2djZRqq4mIl1dBBbnkkkv41re+xcqVKznzzDM5/fTTeeCBBzjizW9+M7W1tUREHCuT07N09I7RPzrFxKYW2pvqiIhXRkEF+eM//mNOPvlkvvWtbzE0NMR/+k//iT/4gz8gIuJY6x+doqVnN8tqljLStZJSbTUR8copqCDf/e53+dCHPsSiRYs44i1veQt1dXU8/vjjREQcK90D43QPjNPX2Ui5rYGIeOUVVJCmpibuvfdenvHoo4/y5JNP8iu/8itERBxtk9OzlLYMsXfmAMNdK2heXkNEHB0FFeAP//AP6erq4gc/+AH/8T/+R8477zz+w3/4D6xZs4bDhw9TVVVFRMTRVB6coH7rMOW2Bvo6GynVVhMRR09BBTjzzDNZu3YtnZ2d3HLLLVxyySV84AMfoKenhyuuuIKIiKNlcnqWjt4x+kenmNjUQntTHRFx9BXMcU899RS33norRzQ3N9Pc3ExzczPNzc00NzfT3NzM6Ogol19+OQ899BAREa+U/tEpWnp2s6xmKSNdKynVVhMRx0bBHLdkyRKuvfZadu7cyZlnnv9aBUQAACAASURBVMkll1zC1q1b+cQnPsGll17Ku971Lv78z/+cSy+9lBNOOIGIiFdC98A43QPj9HU2Um5rICKOrYIK8Ku/+qt87GMf4/bbb+fDH/4wknjDG97AWWedxX/9r/+V7du3c9JJJxER8XKbnJ6ltGWIvTMHGO5aQfPyGiLi2CuoIK9+9at585vfTEdHB+effz6nn346tbW1RES8EsqDE7T07Kbc1kBfZyOl2moiYm4oiIiIf2Zyepbmnl30j04x3LWC9qY6ImJuKYiIiP+rf3SKlp7dtDfVMdK1klJtNREx9xRUmL/927/l05/+NENDQ9x7770cOnSIiIiXQ0fvGN0D4/R1NtLdWk9EzF0FFWTnzp1s2rSJqakpHnzwQR544AGuvPJKIiJeipE9M5S2DHHE5OZVNC+vISLmtoIKcvvtt9PT08Opp55KVVUVH/nIR3jooYeYnZ0lIuLFKA9O0NE7Rrmtgb7ORiKiMhRUkKIoOHToEM84dOgQ+/btY9GiRUREvBCT07M09+yif3SK4a4VtDfVERGVo6CCfOhDH6Krq4u//uu/ZteuXaxfv55TTz2VxYsXExHxfPWPTtHSs5v2pjpGulZSqq0mIipLQQX5nd/5HcrlMg0NDSxbtoyzzz6ba665hoiI56ujd4zugXH6Ohvpbq0nIipTQYU58cQTWb9+PVdeeSWrV6/mwIEDvFgHDx7kuuuuY+3atZxzzjl85zvfISLmp5E9M5S2DHHE5OZVNC+vISIqV0EFueaaa+jt7eXZ3vve9/Ji3X333Tz55JPs2LGDj370o1x33XVExPxTHpygo3eMclsDfZ2NRETlK6ggTzzxBIODg1xzzTU8/fTTvBzOOeccjjj55JN54okneC6SkIQkNmzYQETMfZPTszT37OLeH+xjuGsF7U11RMx3GzZsQBKSkMR8VVBhrr32Wn7zN3+TD33oQzz++OO8FO9617toampi//79XHPNNXR2dvJcbGMb22zfvp2ImNv6R6eo3zpMe1MdfZ2NlGqriVgItm/fjm1sY5v5qqACrVu3jgsvvJDzzjuPJ554gpfinnvu4aKLLmLNmjWcd955RERlm5yepaN3jO6BcSY2tdDdWk9EzD8FFeTtb387xx9/PEe0trbyx3/8x7zxjW/kxbr33nu5/fbb+exnP8tpp51GRFS2kT0ztPTsZlnNUiY3r6JUW01EzE8FFeDjH/84f/u3f8vDDz/MH/zBH3DppZdy6aWXsm3bNpYsWcKL1dfXx+TkJBdffDEf/OAH6e7uJiIqU/fAOB29Y5TbGii3NRAR81tBBTj77LMplUqcdtpprFu3jnXr1rFu3TrWrVvHunXreLHK5TJ33XUXt912G7fddhvlcpmIqCyT07M09+xi78wBhrtW0N5UR0TMfwUVoLGxkUcffZRFixaxcuVKli5dyuc//3n+6q/+ipNPPpmIWJj6R6eo3zpMe1MdfZ2NlGqriYiFoaAC/Lf/9t/49//+3/Pggw/y5JNPcvHFF/Ov/tW/4vDhw1x++eVExMIyOT1LR+8Y3QPjTGxqobu1nohYWAoqQE9PD/39/bz97W9ncHCQFStW8OEPf5irrrqKqakpZmZmiIiFYWTPDC09u1lWs5TJzaso1VYTEQtPwRx38OBBjmhoaOCI+++/n5aWFp7xmte8hunpaSJi/useGKejd4xyWwPltgYiYuEqmOMWLVrEL/3SL/HEE0/wk5/8hG984xv87u/+Lkfs37+f//W//he//uu/TkTMX5PTszT37GLvzAGGu1bQ3lRHRCxsBRXgoosu4qyzzuI973kPJ510EieddBJDQ0Ocd955tLW1sWTJEiJifuofnaJ+6zDdrfX0dTZSqq0mIqKgArz3ve/llltu4aqrruKGG27giNnZWdatW0d3dzcRMf9MTs/S0TtGeXCCiU0ttDfVERHxjIIKcdJJJ/F7v/d7LF26lCPe9ra38Y53vIOImH/6R6do6dnNspqljHStpFRbTUTEsxVERMwh3QPjdA+M09fZSLmtgYiIn6UgImIOmJyepbRliL0zBxjuWkHz8hoiIp5LQQV59NFHOXjwIM/28MMPExGVrTw4Qf3WYcptDfR1NlKqrSYi4ucpqCDXXnst//AP/8AzDh06RGdnJxFRmSanZ+noHaN/dIqJTS20N9UREfF8FFSAgYEBTjnlFL7xjW9w1llnccopp3DKKadw6qmncuKJJxIRlad/dIqWnt0sq1nKSNdKSrXVREQ8XwUVoK2tjfvvv5+2tjbuuusu7r//fu69916+/OUvc9NNNxERlaV7YJzugXH6OhsptzUQEfFCFVSQD37wg1x++eUcOnSI97///bS1tXHttdcSEZVhcnqW0pYh9s4cYLhrBc3La4iIeDEKKkhPTw8XX3wxo6OjHHfccQwPD/Od73yH/fv3ExFzW3lwgvqtw5TbGujrbKRUW01ExItVUEEeeeQRTj31VO677z7e9ra3UVVVxfHHH8+TTz5JRMxNk9OzdPSO0T86xcSmFtqb6oiIeKkKKkhTUxPXXXcdO3bs4K1vfStf+cpXeOSRR3jNa15DRMw9/aNTtPTs5tTfOJ6RrpWUaquJiHg5FFSQyy+/nJNPPplPfvKT1NfX88Mf/pAbbriBqqoqImJu6egdo3tgnL7ORrpb64mIeDkVVJBdu3ZRXV3ND37wA3bs2EF1dTX33nsvETF3jOyZobRliCMmN6+ieXkNEREvt4IKMj09zcMPP8zDDz/M3r17+eIXv8j9999PRMwN5cEJOnrHKLc10NfZSETEK6Wggrz73e/msssu47LLLuOKK65gx44d/OhHP+Lw4cNExLEzOT1Lc88u+kenGO5aQXtTHRERr6SCCrZo0SL+6Z/+iX379hERx0b/6BQtPbtpb6pjpGslpdpqIiJeaQUV5L/8l//CFVdcwRVXXMEVV1zB2rVrWbJkCTU1NUTE0dfRO0b3wDh9nY10t9YTEXG0FFSQFStWcOaZZ3LmmWdy5pln0t3dzV/8xV8QEUfXyJ4ZSluGOGJy8yqal9cQEXE0FVSQxsZGGhsbqa+vp76+nte85jVs2bKF/fv3ExFHR3lwgo7eMcptDfR1NhIRcSwUVJDPfe5znHXWWZx99tlcfvnlfPCDH+Qf/uEfWLJkCRHxypqcnqW5Zxf9o1MMd62gvamOiIhjpaCC3H333XzhC1/gsssuY8OGDXzlK1/hVa96FYsWLSIiXjn9o1O09OymvamOka6VlGqriYg4lgoqyKte9Sp+8pOf8Fu/9Vt873vf4/jjj+fpp59m3759RMQro6N3jO6BcYa7VtDdWk9ExFxQUEHe9a53sW7dOpYvX86XvvQlbr75Zh588EGqq6uJiJfXyJ4ZSluGWFazlMnNqyjVVhMRMVcUVJC1a9fyiU98gl/+5V9my5YtPProo1x//fUsWbKEiHj5dA+M09E7RrmtgXJbAxERc01BBTh48CDPePOb38zSpUt585vfzFVXXcXv/u7vEhEvj8npWZp7drF35gDDXStob6ojImIuKqgAa9as4emnn+aI+++/n7GxMSLi5dU/OkX91mHam+ro62ykVFtNRMRcVVBhdu/ezdjYGBHx8picnqWjd4zugXEmNrXQ3VpPRMRcV7AADA4O8kd/9Ef8LBdeeCFr165l7dq1XH/99UQsJCN7Zmjp2c2ymqVMbl5FqbaaiIhKUDCPzczMcPXVV3PZZZfx1FNP8dP279/PwYMH2bFjBzt27OCKK64gYqHoHhino3eMclsD5bYGIiIqSUGFeOtb38qqVav40z/9U66//npWrVrFqlWrWLVqFc/luOOO49xzz+Wyyy7jZ/ne977HCSecwMDAAIODgxw6dIiI+W5yepbmnl3snTnAcNcK2pvqiIioNAUV4Gtf+xpDQ0MMDQ3x7W9/m927dzM0NMTQ0BBDQ0M8l8WLF/Pbv/3b1NfX87M89NBDPPbYYyxZsoSvf/3rXHnllTwXSUhCEhs2bCCiEvWPTlG/dZj2pjr6Ohsp1VYTEfPLhg0bkIQkJDFfFSxga9as4aabbmLNmjV8/OMf59vf/jYHDhzgZ7GNbWyzfft2IirJ5PQsHb1jdA+MM7Gphe7WeiJiftq+fTu2sY1t5quCBejgwYM8/vjj3HzzzezcuZMjfvzjH3Po0CEWL15MxHwysmeGlp7dLKtZyuTmVZRqq4mIqHQFC9D3v/99Tj/9dN75zndy4403sn79ei644AI2bdpEURREzBfdA+N09I7R19lIua2BiIj5omABaG1t5eqrr+YZDQ0N7Nq1ixNOOIH+/n5uuOEG7rjjDlavXk3EfDA5PUtpyxB7Zw4w3LWC5uU1RETMJwURMa+UByeo3zpMua2Bvs5GSrXVRETMNwURMS9MTs/S0TtG/+gUE5taaG+qIyJiviqIiIrXPzpFS89ultUsZaRrJaXaaiIi5rOCiKho3QPjdA+M09fZSLmtgYiIhaAgIirS5PQspS1D7J05wHDXCpqX1xARsVAURETFKQ9OUL91mHJbA32djZRqq4mIWEgKIqJiTE7P0tE7Rv/oFBObWmhvqiMiYiEqiIiK0D86RUvPbpbVLGWkayWl2moiIhaqgoiY87oHxukeGKevs5FyWwMREQtdQUTMWSN7ZihtGWLvzAEmN6+ieXkNEREBBRExJ5UHJ+joHaPc1kBfZyMREfH/FETEnDI5PUtzzy76R6cY7lpBe1MdERHxzxVExJzRPzpFS89u2pvqGOlaSam2moiI+JcKImJO6Ogdo3tgnL7ORrpb64mIiOdWEBHH1MieGUpbhjhicvMqmpfXEBERP19BRBwz5cEJOnrHKLc10NfZSEREPD8FEXHUTU7P0tyzi/7RKYa7VtDeVEdERDx/BRFxVPWPTtHSs5v2pjpGulZSqq0mIiJemIKIOGo6esfoHhinr7OR7tZ6IiLixSmIiFfcyJ4ZSluGWFazlMnNq2heXkNERLx4Bf9fe3AYm3dhWHv4lz+z40UoMRvyWBa74YN7YLiy2uRD7UgLTbtQEzR37eziQF3QoFo15CgeCVtECJANCcG84k2AlGjajKZkdrfhgkaG1KTuhAORI7BqCR0sMZoXseEtiZ2wxg61dWVV0eVyoaWQQOz3PE9EXFA9Q8do7xujp7WentZ6IiLioyuIiAuiNDlNU+8Iz//4FMNda2hrrCEiIs6Pgog47wZGJ6jbPUxbYw39nQ3UVlcRERHnT0FEnDelyWna+8boHhzn2M5mutfXERER519BRJwXh1+born3KKtWLKV0zzpqq6uIiIgLoyAiPrLuwXHa+8boaa2np7WeiIi4sAoi4kMrTU7T1DvC61MzDHetoa2xhoiIuPAKIuJDGRidoG73MG2NNfR3NlBbXUVERHw8CiLil1KanKa9b4zuwXGO7Wyme30dERHx8SqIiA/s8GtTNPceZdWKpZTuWUdtdRUREfHxK4iID6R7cJz2vjF6Wuvpaa0nIiI+OQUR8XOVJqdp6h3h9akZhrvW0NZYQ0REfLIKIuJ99Qwdo273MN3r6+jvbKC2uoqIiPjkFUTE/6c0OU173xgDoxMc29lMW2MNERFx8SiIiP/HwOgEzb1HWbViKYe71lJbXUVERFxcCoKhoSEefvhhIroHx+keHKe/s4Ge1noiIuLiVFDGpqam2LFjB1u3buXs2bNE+SpNTlN7/3O8PjXDcNcamlavICIiLl4FZWzZsmXcdNNNbN26lShfPUPHqNs9TE9rPf2dDdRWVxERERe3gjJWUVHBNddcQ11dHb+IJCQhiS1bthALX2lymva+MQZGJzi2s5m2xhoiIha6LVu2IAlJSGKxKogPxDa2sc0jjzxCLGwDoxM09x5l1YqlHO5aS211FRERi8EjjzyCbWxjm8WqIKLMdA+O0z04Tn9nAz2t9URExMJTEFEmSpPT1N7/HK9PzTDctYam1SuIiIiFqSBYv349O3bsIBavnqFjNPcepae1nv7OBmqrq4iIiIWrIGIRK01O0943xsDoBMNda2hrrCEiIha+gohFamB0gubeo3z+U8s53LWW2uoqIiJicSiIWITa+8boHhynv7OB7vV1RETE4lIQsYgcfm2K2vufY17pnnU0rV5BREQsPgURi0TP0DHa+8boaa2nv7OBiIhYvAoiFrjS5DRNvSMMjE4w3LWGtsYaIiJicSuIWMAGRido7j1KW2MNh7vWUltdRURELH4FEQtUe98Y3YPj9Hc20L2+joiIKB8FEQvM4demqL3/OeaV7llH0+oVREREeSmIWEB6ho7R3jdGT2s9/Z0NREREeSqIWABKk9M09Y4wMDrBcNca2hpriIiI8lUQcZEbGJ2gufcobY01HO5aS211FRERUd4KIi5Spclp2vvG6B4cZ7hrDd3r64iIiJhXEHEROvzaFM29R1m1Yimle9ZRW11FRETEOQURF5nuwXHa+8boaa2np7WeiIiIdyuIuEiUJqdp6h3h9akZhrvW0NZYQ0RExHspiLgIDIxOULd7mLbGGvo7G6itriIiIuL9FER8gkqT07T3jdE9OM6xnc10r68jIiLiFymI+IQcfm2K5t6jrFqxlNI966itriIiIuKDKIj4BHQPjtPeN0ZPaz09rfVERET8MgoiPkalyWmaekd4fWqG4a41tDXWEBER8csqiPiYDIxOULd7mLbGGvo7G6itriIiIuLDKIi4wEqT07T3jdEzdIxjO5vpXl9HRETER1EQcQENjE7Q3HuUVSuWcrhrLbXVVURERHxUBREXSPfgON2D4/R3NtDTWk9ERMT5UhBxnpUmp6m9/zlen5phuGsNTatXEBERcT4VRJxHPUPHqNs9TE9rPf2dDdRWVxEREXG+FUScB6XJadr7xhgYneDYzmbaGmuIiIi4UAoiPqKB0Qmae4+yasVSDnetpba6ioiIiAupIOIj6B4cp3twnP7OBnpa64mIiPg4FER8CKXJaWrvf47Xp2YY7lpD0+oVREREfFwKIn5JPUPHqNs9TE9rPf2d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6NAhtm/fTjm74YYbaGxs5MyZM9x99910dnZS7m644QYaGxs5c+YMd999N52dnbzTG2+8wfHjx6msrOTQoUNs376dcva5z32O1atX8+CDD7J9+3ZuuukmFpOCeE+VlZXMzMxwzvT0NJWVlZSryspKZmZmOGd6eprKykrOaWlp4fHHH6elpYV7772XF198kZmZGSI+qJaWFh5//HFaWlq49957efHFF5mZmaGc/fCHP+T222+npaWFb37zmwT88Ic/5Pbbb6elpYVvfvObvFNLSwuPP/44LS0t3Hvvvbz44ovMzMxQrk6dOsXs7Cx33XUXTz31FH/6p3/K7Owsi0VBvKerrrqKI0eOMO/48eOcPHmSyy+/nHJ11VVXceTIEeYdP36ckydPcvnllzM7O8uJEyfYu3cvBw8eZN7p06eZm5ujoqKCiF9kdnaWEydOsHfvXg4ePMi806dPMzc3R0VFBeXq+eefZ//+/ezZs4cvfelLBDz//PPs37+fPXv28KUvfYlzZmdnOXHiBHv37uXgwYPMO336NHNzc1RUVFCuenp6ePLJJ5m3bNky3n77bebm5lgsCuI9tbS08Oabb9LZ2cnNN9/MnXfeSVEUlKuWlhbefPNNOjs7ufnmm7nzzjspioJXX32VjRs3cv311/PYY49xxx13cOutt7Jz506KoiDiF3n11VfZuHEj119/PY899hh33HEHt956Kzt37qQoCspVf38/pVKJb33rW3zjG9+gu7ubctff30+pVOJb3/oW3/jGN+ju7mbeq6++ysaNG7n++ut57LHHuOOOO7j11lvZuXMnRVFQrm6//XaeeOIJ/vAP/5DNmzdzxx13UFFRwWJREO+poqKCPXv28Oijj/L000+zadMmyllFRQV79uzh0Ucf5emnn2bTpk3Mq6+vZ2RkhJUrVzIwMMADDzzAwMAAGzZsIH5m/fr17Nixg/iZ9evXs2PHDs6pr69nZGSElStXMjAwwAMPPMDAwAAbNmygnPX09PDUU0/xxBNP8MQTT9DT00O56+np4amnnuKJJ57giSeeoKenh3n19fWMjIywcuVKBgYGeOCBBxgYGGDDhg2Us9/6rd/iySef5K/+6q8YGBjga1/7GotJQfxcl156KZdccgnxM5deeimXXHIJ72f58uUsWbKEiA9r+fLlLFmyhIgPa/ny5SxZsoT4meXLl3PJJZew2BRERERELDAFEREREQtMQURERMQCUxARERGxwBRERERELDAFEREf0o9//GOuvvpqvvCFL7Bhwwauu+46/uIv/oJTp05xvoyMjPDtb3+beX/9139NRMS8goiIj+DXfu3XOHToEAcPHuR73/seS5Ys4U/+5E84Xz7zmc+we/du5vX19RERMa8gIuI8Wbp0Kdu3b2dsbIwf//jHDAwMcMMNN7Bp0yb27t3LvBdeeIEHHniAb3/721x77bXcdtttzMzM8D//8z90dnayceNGvvzlL/ODH/yAea+88gq9vb3ceOONvPXWW2zcuJH//M//5M477+TIkSOc82d/9meMjo4SEeWhICLiPPqVX/kVrrzySmzzz//8zwwMDPBP//RPDA0N8fzzz3PmzBmefPJJdu7cyfe//31++tOf8oMf/IAnn3wSSTz77LP09vbS39/PvJmZGf77v/+b/fv3c+mll/Lss8/ym7/5mzQ1NfHkk08y76233mJkZITPfOYzRER5KIiIOM/efvttRkZGuPTSS/n7v/97/u7v/o5LL72UgwcPMu/zn/88K1eu5JJLLqGxsZETJ06wZs0a/vVf/5U///M/p1Qq8Z3vfIefp6WlheHhYd5++20OHjxIS0sLRVEQEeWhICLiPPrf//1f/uM//oPly5dTXV1NTU0NNTU1/O7v/i7XXXcd85YuXcq7ffazn+V73/sev/3bv813v/tdvvKVr/DTn/6U97Ns2TLWrVvHv//7v3PgwAF+//d/n4goHwUREefJW2+9xa5du9iwYQMNDQ2cPn2ar3zlK3z1q1+lVCoxMzPD+9m7dy/PP/88X/3qV3n00Uc5efIkJ06c4J2WLFnC3Nwc5/zBH/wB/f39nD59miuvvJKIKB8FEREfwYkTJ/jCF77AF7/4RTo6OviN3/gNdu/ezbXXXsuqVav4vd/7PTZv3kypVKKpqYn388UvfpFHH32UW265ha997Wtcd9111NTU8E6f+9zn+PKXv8x//dd/Me+zn/0sx44dY9OmTUREeSmIiPiQPvWpT/Hyyy9z6NAhvv/97/PUU0+xbds2li5dyry7776bf/mXf+Fv//Zvefjhh1myZAnXXnstDz30EOds3bqVjo4OrrzySp5++mn+8i//kn/4h3/g3nvvZd7atWt57LHHmPf444/z7LPPcsUVVzBvbm6Ooii4/vrriYjyUhARcQFVVFRQVVXFB7FkyRJ+/dd/nV/91V/lF3nxxRf5oz/6I37nd36H5cuXExHlpSAiYgG68sor+eM//mO2bdtGRJSfgoiIBai6uprGxkaWLFlCRJSfgoiIiIgFpiAiIiJigSmIiIiIWGAKIiIiIhaYgoiIiIgFpiAiIiJigSmIiIiIWGAKIiIiIhaYgoiIiIgFpiAiIiJigSmIiIiIWGAKIiIiIhaYgoiIiIgF5v8A4tt04blIwEIAAAAASUVORK5CYII=" style="width: 100%; height: auto;"></div></div></div></div></div></div></div><div class = 'S8'><span>Isn't it obvious now that the smaller the density the better?! Indeed, for two Faust objects of the same shape and the same number of factors, a smaller density (linearly) implies a smaller file size for storage. This point applies also to the memory (RAM) space to work on a Faust.</span></div><div class = 'S0'><span>We'll see later how the computation can benefit of a bigger RCG (or smaller density). But let's point out right now that the sparsity is often a tradeoff with accuracy, as the following plot shows about the truncated SVD of a matrix </span><span style="vertical-align:-5px"><img src="data:image/png;base64,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" width="85" height="19" /></span><span>. Note beforehand that the SVD of M (truncated or not) can be seen as a Faust which approximates M.</span></div><div class = 'S0'><span></span></div><div class = 'S0'><img src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAABILUlEQVR42u2dCXgV5dm/i2EVBFGw4EJitUDUfgha1KpBXEDcxX5qtUi1oqBAUKriUsF+4FpF60e1Iu4iVYl1LWpVoLJpBVzKvi/ijp8bi+Lz7+9t3/znTGbOkgRykrnv65oryck5c2Z55n3uebf5gQEAAABAovgBhwAAAAAAAQQAAAAABBAAAAAAEEAAAAAAQAABAAAAAAEEAAAAAAQQAAAAABBAAAAAAEAAAQAAAAABBAAAAAAEEAAAAAAQQAAAAABAAAEAAAAAAQQAAABAAO+//377wQ9+UL4UFBRYmzZt7IwzzrBFixZV+guGDx/u1lcZnn/+eff5KAoLC61v377b/IB169Yt5TgFF21TUgnHT6NGjeyHP/yhHXHEEXb99dfbhx9+mD9B/6/tC8bVP//5T/f38uXLa2ybJkyYYPvss481btzYbd+cOXMiYz4u9oKLzkVt54477rCHH3642te7YcMGd4xuuOGGjO9VPFxwwQW29957u/PSsmVL+8lPfuJee//99917iouLbc8997Tvv/8+dj1dunSxtm3b2nfffWfz589POVf169e3nXfe2bp27WqXXnqp+3918te//tU6d+5s22+/vfs+/V3bOOigg6xnz55k6yx58MEH7c4778zpMz4uH3vssWqLOx/jces85JBD3P87dOiQ9XoPPfRQKy0trbDdUctTTz2V8tnXXnvNzjvvPHc9NGzY0L1n3bp1Fb5j3rx5NmTIENt///2tefPm7vo87LDDKqwvF6644orIbWzRokWF995888128sknW7t27dx74mL/z3/+s51++umu/FH5VFRUZH369LGlS5emvG/jxo22++6721133ZVZAPVzxowZ7mCNHDnSmjRpYrvssot99tln21wAL7744tjPzp4925YsWVIjAvijH/3IHaPwom1KugD6+Jk6dao9+eST7kJSkO+000728ssv58W2avtWr15d/vcTTzzhtl0xXxN89NFH1qBBAzvxxBNt8uTJbvu+/vrryJgPxtuvf/1rt92TJk1KeV3rq+3stddeWyXpZyuAy5Ytc8LXsWNH+9Of/mSvvvqqlZWV2f/8z/84CdRxFrfccotb3yuvvBK5nrffftv9f9iwYSkJa+jQoW4d06ZNs2effdauu+46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7if7xT6xT+wT54p9Yp8AAQQAAAAABBAAAAAAEEAAAAAAQAABAAAAEEDYhowZM8aKioqsUaNG1qVLF5s6dWra9z/55JNWXFxsDRs2dD/LyspS/v/999+7Drht27a1xo0bW7du3ey9997L232655577LDDDrMdd9zRLUcddZTNmjUr5T19+/atMCP8QQcdlLf7dP/990fOYr9hw4Yqnfua3i/FUtR+HXfccXlzrqZMmWInnHCCi39991NPPZXxM5MnT3b7rmOw55572l133VXl67Qm92nixIl29NFHW6tWrWyHHXawgw8+2CZNmpTyHpUR4fP0wx/+MG/36bXXXouMvfnz5+dUPubTPkVdK1r22WefvDlP119/vR144IHWrFkza926tZ188sm2YMGCjJ+rDXkKEMAaZcKECdagQQMbO3aszZs3z0pLS61p06a2cuXKyPdPnz7dCgoK3EWpgk8/69evbzNnzix/z4033ugKfSWBd99918444wx3kX3xxRd5uU9nnXWWS65z5sxx+3TuuedaixYtbM2aNSkF5bHHHmvr1q0rXz799NO8PU8SwObNm6dsr5aqrDMf9kvHPLg/KrAVj9rffDlXL7zwgl199dUu/rNJwsuWLbPtt9/e7buOgY6FjokSWL6cq1z3Sdt300032RtvvGGLFi2yK6+80m3/7NmzU8Ri3333TTlPH330Ud6eJy+ACxcuTNnm7777LqfyMZ/2SU+3CO6LnnSx0047uXOTL+epZ8+e7vrWtT537lw7/vjjrV27dvbVV1/FfqY25ClAAGucrl27Wv/+/VNe69ixow0bNizy/aeffrpLruEL9Mwzzyy/q2rTpo27uDwaii+huvvuu/Nyn8KoQFfB8OCDD6ZIhe48a8t5UoGpY741j1M+nKvRo0e7cxVMBjV9rlIKtiyS8OWXX+72OciFF17oas3y6Vzlsk9RqFbpuuuuSxGLTp061Zrz5AVw/fr1se/JVD7m+3nS++vVq2crVqzIy/MkJJ/aN9V2VvY85EOeAgSwRtm0aZO7SwpXjQ8ePNhKSkoiP7PHHnvYbbfdlvKa/tYdmVi6dKm7OIN3+uKkk06yc845Jy/3KYzuANUk8Oyzz6ZIhQoHNUH8+Mc/tvPPP98+/PDDvD1PEkB9Rudlt912c3fNwXNSHccpH87VfvvtZ/369Ut5rSbPVWWS8OGH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eOGF7veysjK3vq+//poTCQAIIABAdQjgT37yEzv++OPtxhtvtN12280WL15cYfn444/LBVBNxkFGjx7t+gN61JT8+uuv27XXXuvWrdo79e3LRQCfeeYZa9GihX3zzTeuSfr888/nJAIAAggAUB0C6AeB3HffffbSSy+5plf13YsjGwEMohpBSeWtt94auR3HHHOMDRw4MPJzu+66q/uc+hROnz6dkwgACCAAQK4CGDcNzAknnOCESzV3hx12mBO8SZMmORGcNm2aXX311W5QSDYCOHPmTLdevX/lypX2+OOPW8OGDe2FF16IFEANAPnpT3/qvku1jME5CTWwRJ/t2LEjJxAAEEAAgMoIYHAiaDXLaiJo1fwFpUuDOwYNGuRq3xo0aGB77LGHnX322bZq1aqsBHDevHnWs2dPt/5GjRpZ+/bt7c4770zZjqAALly40A4++GBr0qSJ27Zg7ePSpUvda+qbCACAAAIAJAD1I5SsfvDBBxwMAEAAAQDqMpqGRgNPNAn1WWedxQEBAAQQAKCuc//997upZ7p06eL6KwIAIIAAAAAAgAACAAAAAAIIAAAAAAggAAAAACCAAAAAAIAAAgAAAAACCAAAAAAIIAAAAAAggAAAAAAIIAAAAAAggAAAAACAAAIAAAAAAggAAAAACCAAAAAAIIAAAAAAkBf8PwxregtdjfnYAAAAAElFTkSuQmCC" width = "524" height = "425" alt = "" style = "vertical-align: baseline"></img></div><div class = 'S0'><span>Here is the script to reproduce the last figure with pyfaust: </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/test_svd_rc_vs_err.py"><span>test_svd_rc_vs_err.py</span></a></div><div class = 'S0'><span></span></div><h3 class = 'S2'><span>2. Faust Algebra and other Operations</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>In order to write some nice algorithms using Faust objects, you'll have to use the basic "stable" operations a Faust is capable of. Let's make a tour of them.</span></div><div class = 'S0'><span></span></div><h4 class = 'S12'><span>2.1 Transpose, conjugate, transconjugate</span></h4><div class = 'S0'><span></span></div><ul class = 'S3'><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a029a3db751ae1282eca2af94ce4101ec"><span>Faust.transpose</span></a><span> or </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a029a3db751ae1282eca2af94ce4101ec"><span>.'</span></a></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#aec9036a3d251fd47038a9a338b91502d"><span>Faust.conj</span></a><span>,</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a66c1abdcbcfe8505457ce69a7b355716"><span>Faust.ctranspose</span></a><span> or </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a66c1abdcbcfe8505457ce69a7b355716"><span>'</span></a></li></ul><div class = 'S0'><span>You are probably familiar with .' and ' shorthand operators from Matlab. Well, they are also used in the Faust class.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>G = matfaust.rand(10, 15, </span><span style="color: rgb(160, 32, 240);">'dim_sizes'</span><span>, [10,15], </span><span style="color: rgb(160, 32, 240);">'field'</span><span>, </span><span style="color: rgb(160, 32, 240);">'complex'</span><span>)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="7A9EAF2D" data-scroll-top="null" data-scroll-left="null" data-testid="output_12" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">G = </span></div><div>Faust size 10x15, density 2.16667, nnz_sum 325, 5 factor(s): -- FACTOR 0 (complex) SPARSE, size 10x14, density 0.357143, nnz 50 -- FACTOR 1 (complex) SPARSE, size 14x13, density 0.384615, nnz 70 -- FACTOR 2 (complex) SPARSE, size 13x13, density 0.384615, nnz 65 -- FACTOR 3 (complex) SPARSE, size 13x15, density 0.333333, nnz 65 -- FACTOR 4 (complex) SPARSE, size 15x15, density 0.333333, nnz 75</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>G.'</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="90D7DC90" data-scroll-top="null" data-scroll-left="null" data-testid="output_13" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 15x10, density 2.16667, nnz_sum 325, 5 factor(s): -- FACTOR 0 (complex) SPARSE, size 15x15, density 0.333333, nnz 75 -- FACTOR 1 (complex) SPARSE, size 15x13, density 0.333333, nnz 65 -- FACTOR 2 (complex) SPARSE, size 13x13, density 0.384615, nnz 65 -- FACTOR 3 (complex) SPARSE, size 13x14, density 0.384615, nnz 70 -- FACTOR 4 (complex) SPARSE, size 14x10, density 0.357143, nnz 50</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>conj(G)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="2EE00C35" data-scroll-top="null" data-scroll-left="null" data-testid="output_14" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x15, density 2.16667, nnz_sum 325, 5 factor(s): -- FACTOR 0 (complex) SPARSE, size 10x14, density 0.357143, nnz 50 -- FACTOR 1 (complex) SPARSE, size 14x13, density 0.384615, nnz 70 -- FACTOR 2 (complex) SPARSE, size 13x13, density 0.384615, nnz 65 -- FACTOR 3 (complex) SPARSE, size 13x15, density 0.333333, nnz 65 -- FACTOR 4 (complex) SPARSE, size 15x15, density 0.333333, nnz 75</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>G'</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="B3BFA437" data-scroll-top="null" data-scroll-left="null" data-testid="output_15" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 15x10, density 2.16667, nnz_sum 325, 5 factor(s): -- FACTOR 0 (complex) SPARSE, size 15x15, density 0.333333, nnz 75 -- FACTOR 1 (complex) SPARSE, size 15x13, density 0.333333, nnz 65 -- FACTOR 2 (complex) SPARSE, size 13x13, density 0.384615, nnz 65 -- FACTOR 3 (complex) SPARSE, size 13x14, density 0.384615, nnz 70 -- FACTOR 4 (complex) SPARSE, size 14x10, density 0.357143, nnz 50</div></div></div></div></div></div><div class = 'S8'><span>What really matters here is that the results of G.', conj(G) and G' are all Faust objects. Behind the scene, there is just one memory zone allocated to the factors. Strictly speaking they are memory views shared between G, G.' and G'. So don't hesitate to use!</span></div><h4 class = 'S12'><span>2.2 Add, Subtract and Multiply</span></h4><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>s = size(G, 1);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>F = matfaust.rand(s, s);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>G = matfaust.rand(s, s, </span><span style="color: rgb(160, 32, 240);">'field'</span><span>, </span><span style="color: rgb(160, 32, 240);">'complex'</span><span>);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>F+G</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="0840809D" data-scroll-top="null" data-scroll-left="null" data-testid="output_16" data-width="926" data-height="146" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 5.6, nnz_sum 560, 8 factor(s): +.S13 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 4px; padding: 6px 45px 4px 13px; line-height: 17.2339992523193px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; } +.S14 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 0px none rgb(0, 0, 0); border-radius: 0px; padding: 6px 45px 0px 13px; line-height: 17.2339992523193px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14px; }</style></head><body><div class = rtcContent><div class = 'S0'></div><h2 class = 'S1'><span>How to Manipulate a Faust</span></h2><div class = 'S0'><span></span></div><div class = 'S0'><span>This livescript is intended to gently introduce the operations available to manipulate a Faust object. It comes after the first livescript (available </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_creation.mlx"><span>here</span></a><span> for download or </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_creation.html"><span>here</span></a><span> as a web page), so it's assumed you already know how to create a Faust object from one way or another.</span></div><div class = 'S0'><span>Keep in mind that a full API doc is available </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/namespacematfaust.html"><span>here</span></a><span> every time you need details. In particular the Faust class is documented </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html"><span>here</span></a><span>.</span></div><div class = 'S0'><span style=' font-weight: bold;'>NOTE</span><span>: the livescript is made to be executed sequentially, otherwise, skipping some cells, you would end up on an import error.</span></div><div class = 'S0'><span></span></div><h3 class = 'S2'><span>Table of Contents:</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><a href = "#H_E9BF5BFF"><span>1. Getting Basic Information about a Faust Object</span></a></div><div class = 'S0'><a href = "#H_95BE1343"><span>1.1 Obtaining Dimension and Scalar Type Information</span></a></div><div class = 'S0'><a href = "#H_0602CE09"><span>1.2 Obtaining Other Faust Specific Information</span></a></div><div class = 'S0'><a href = "#H_2CF60B15"><span>1.3 Plotting a Faust</span></a></div><div class = 'S0'><a href = "#H_C5C21250"><span>1.4 About Sparsity!</span></a></div><div class = 'S0'><span></span></div><div class = 'S0'><a href = "#H_73387A87"><span>2. Faust Algebra and other Operations</span></a></div><div class = 'S0'><a href = "#H_5E556DD4"><span>2.1 Transpose, conjugate, transconjugate</span></a></div><div class = 'S0'><a href = "#H_99DA98B4"><span>2.2 Add, Subtract and Multiply</span></a></div><div class = 'S0'><a href = "#H_BD8A7C70"><span>2.3 Faust Multiplication by a Vector or a Matrix</span></a></div><div class = 'S0'><a href = "#H_7AF16EFF"><span>2.4 Faust Norms</span></a></div><div class = 'S0'><a href = "#H_1070C649"><span>2.5 Faust Normalizations</span></a></div><div class = 'S0'><a href = "#H_B081D439"><span>2.6 Faust Concatenation</span></a></div><div class = 'S0'><a href = "#H_EBCC81E9"><span>2.7 Faust Indexing and Slicing</span></a></div><div class = 'S0'><span></span></div><h3 class = 'S2' id = 'H_E9BF5BFF' ><span>1. Getting Basic Information about a Faust Object</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>First of all, given any object, you might ask yourself if it's a Faust or not (typically when you receive an object in a function, matlab being built on dynamic types, you can't say for sure it's a Faust). </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#ac5d5fbe66ef212a1c7043b78504f87fc"><span>Faust.isFaust()</span></a><span> is the function to verify an object is a Faust. Its use is straighforward as you can see in the documentation. Note by the way, that a more accessible alias is available at the package root </span><span style=' font-family: monospace;'>(matfaust.isFaust</span><span>).</span></div><div class = 'S0'><span></span></div><h3 class = 'S2' id = 'H_95BE1343' ><span>1.1 Obtaining Dimension and Scalar Type Information</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>Firstly, let's list basic Faust informative methods/attributes you're probably used to for matlab matrices:</span></div><ul class = 'S3'><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a7146c7de95b35efc570a377765edda27"><span>size</span></a><span>,</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#af62f554cd8b491a2c75ee06019f87d8a"><span>numel</span></a><span>,</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a7527e1fda21bc1678646a4b40db28eb6"><span>isreal</span></a><span>.</span></li></ul><div class = 'S0'><span>To keep it really clear, let's show some examples operated on a random Faust.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F = matfaust.rand(5,10)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="B93E932D" data-testid="output_0" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">F = </span></div><div>Faust size 5x10, density 3.1, nnz_sum 155, 5 factor(s): +- FACTOR 0 (real) SPARSE, size 5x8, density 0.625, nnz 25 +- FACTOR 1 (real) SPARSE, size 8x8, density 0.625, nnz 40 +- FACTOR 2 (real) SPARSE, size 8x5, density 1, nnz 40 +- FACTOR 3 (real) SPARSE, size 5x5, density 1, nnz 25 +- FACTOR 4 (real) SPARSE, size 5x10, density 0.5, nnz 25</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>size(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="4491F0F0" data-testid="output_1" data-width="1172" style="width: 1202px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 1172px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">1×2</span></div><div class="valueContainer" data-layout="{"columnWidth":40,"totalColumns":2,"totalRows":1,"charsPerColumn":6}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 82px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 5 10 +</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>numel(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 50</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>isreal(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="E2251216" data-testid="output_3" data-width="1172" data-height="34" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 +</div></div></div></div></div></div><div class = 'S8'><span>If the attributes printed out above seem not clear to you, you're probably not a Matlab user. Anyway you'll find all descriptive informations in the FAµST API documentation (see the links above).</span></div><div class = 'S0'><span>As a complement, you can also refer to the Matlab API documentation:</span></div><ul class = 'S3'><li class = 'S4'><a href = "https://www.mathworks.com/help/matlab/ref/size.html"><span>size</span></a></li><li class = 'S4'><a href = "https://www.mathworks.com/help/matlab/ref/numel.html"><span>numel</span></a></li><li class = 'S4'><a href = "https://www.mathworks.com/help/matlab/ref/isreal.html"><span>isreal</span></a></li></ul><div class = 'S0'><span>About size, it's noteworthy that contrary to what Matlab is capable of on an array, you cannot </span><a href = "https://www.mathworks.com/help/matlab/ref/reshape.html"><span>reshape</span></a><span> a Faust.</span></div><h3 class = 'S2'><span></span></h3><h3 class = 'S2' id = 'H_0602CE09' ><span>1.2 Obtaining Other Faust Specific Information</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>As you've seen in this livescript and the first one, when you print a Faust object, several pieces of information appear. Most of them are also available independently with specific functions.</span></div><div class = 'S0'><span>For instance, if you want information about factors, nothing is more simple than calling directly the next functions:</span></div><ul class = 'S3'><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a5e77419460592366457aa60175472e2e"><span>numfactors()</span></a><span> ; which gives you the number of factors (aka layers) a Faust object is composed of.</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a65a84416b4b1fd050654a02232e95d2f"><span>factors()</span></a><span> ; which allows you to copy any of the Faust's factors givens its index.</span></li></ul><div class = 'S0'><span>Going back to our F object, let's call these functions:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>numfactors(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 5</div></div></div></div><div class = 'S8'><span>For example, try to copy the third factor:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>f3 = factors(F, 3)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement scrollableOutput" uid="E771A4F9" data-testid="output_5" data-width="1172" data-height="580" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">f3 = </span></div><div> (1,1) 0.6747 + (2,1) 0.1861 + (3,1) 0.3943 + (4,1) 0.9627 + (5,1) 0.8914 + (6,1) 0.9190 + (7,1) 0.3666 + (8,1) 0.6478 + (1,2) 0.9990 + (2,2) 0.5762 + (3,2) 0.7183 + (4,2) 0.9727 + (5,2) 0.1263 + (6,2) 0.2359 + (7,2) 0.6577 + (8,2) 0.9747 + (1,3) 0.4491 + (2,3) 0.2179 + (3,3) 0.9607 + (4,3) 0.2979 + (5,3) 0.6902 + (6,3) 0.4500 + (7,3) 0.9129 + (8,3) 0.2257 + (1,4) 0.7983 + (2,4) 0.3299 + (3,4) 0.3559 + (4,4) 0.8236 + (5,4) 0.1541 + (6,4) 0.4884 + (7,4) 0.0303 + (8,4) 0.1343 + (1,5) 0.5932 + (2,5) 0.4671 + (3,5) 0.0055 + (4,5) 0.0170 + (5,5) 0.5230 + (6,5) 0.1512 + (7,5) 0.9959 + (8,5) 0.1423 +</div></div></div></div></div></div><div class = 'S8'><span>Note that, since Faust 2.3, the function doesn't alterate the factor format. If the Faust object contains a sparse factor then you'll receive a sparse matrix.</span></div><div class = 'S0'><span>Since Faust 2.3 again, it's possible to retrieve a sub-sequence of Faust factors.</span></div><div class = 'S0'><span>Go straight to the example, extracting factors from F:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>factors(F, 3:4)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="48DD6E63" data-testid="output_6" data-width="1172" data-height="62" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 8x5, density 1.625, nnz_sum 65, 2 factor(s): +- FACTOR 0 (real) SPARSE, size 8x5, density 1, nnz 40 +- FACTOR 1 (real) SPARSE, size 5x5, density 1, nnz 25</div></div></div></div></div></div><div class = 'S8'><span>Hmm... something is different from the previous example. We indeed received a Faust as return type, great! You've just learned another way to create a Faust from another, additionally to what you've seen in the first </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/Faust_manipulation.html"><span>livescript</span></a><span>.</span></div><div class = 'S0'><span>Without this function, you'd surely have written something similar to:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>import </span><span style="color: rgb(160, 32, 240);">matfaust.Faust</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>Faust({factors(F, 3), factors(F, 4)})</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="57A2B1EB" data-testid="output_7" data-width="1172" data-height="62" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 8x5, density 1.625, nnz_sum 65, 2 factor(s): +- FACTOR 0 (real) SPARSE, size 8x5, density 1, nnz 40 +- FACTOR 1 (real) SPARSE, size 5x5, density 1, nnz 25</div></div></div></div></div></div><div class = 'S8'><span>OK, that's not awful but I let you imagine how much complicated it is with more factors.</span></div><div class = 'S0'><span></span></div><h3 class = 'S2' id = 'H_2CF60B15' ><span>1.3 Plotting a Faust</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>It's quite useful to print a </span><span style=' font-family: monospace;'>Faust</span><span> as we've seen before, calling disp(F), </span><span style=' font-family: monospace;'>display(F)</span><span> or just </span><span style=' font-family: monospace;'>F</span><span> in an interactive terminal but this is wordy. How about plotting a Faust in a more graphical fashion ?</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>imagesc(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsFigure" uid="84E24A62" data-testid="output_8" style="width: 1202px;"><div class="figureElement" style="cursor: default;"><div class="figureContainingNode" style="width: 560px; max-width: 100%; display: inline-block;"><div class="GraphicsView" data-dojo-attach-point="graphicsViewNode,backgroundColorNode" id="uniqName_197_54" widgetid="uniqName_197_54" style="width: 100%; height: auto;"><img class="ImageView figureImage" data-dojo-attach-point="imageViewNode" draggable="false" ondragstart="return false;" id="uniqName_197_56" widgetid="uniqName_197_56" src="data:image/png;base64,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" style="width: 100%; height: auto;"></div></div></div></div></div></div></div><div class = 'S8'><span>What do we see above ? On the bottom right is the dense matrix associated to F, obtained with </span><span style=' font-family: monospace;'>full(F)</span><span>. On the top are the indexed factors of F. Note that you can change the default </span><a href = "https://www.mathworks.com/help/matlab/ref/colormap.html"><span style=' text-decoration: underline;'>colormap</span></a><span> in matplotlib parameters.</span></div><div class = 'S0'><span>Let's look at a last example:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>imagesc(Faust({eye(5,4),eye(4,10)}))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsFigure" uid="869DBEED" data-testid="output_9" style="width: 1202px;"><div class="figureElement" style="cursor: default;"><div class="figureContainingNode" style="width: 560px; max-width: 100%; display: inline-block;"><div class="GraphicsView" data-dojo-attach-point="graphicsViewNode,backgroundColorNode" id="uniqName_197_57" widgetid="uniqName_197_57" style="width: 100%; height: auto;"><img class="ImageView figureImage" data-dojo-attach-point="imageViewNode" draggable="false" ondragstart="return false;" id="uniqName_197_59" widgetid="uniqName_197_59" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAYAAAAv7h+nAAAgAElEQVR4AezBD5RedX3v+zdPJpMEfsUqHSJyTluiB0U2gifivSuuEH5158ifaeTklGYFJVmWTqAP+7JcC//cK9YIXJQ4SMHPz2kr4/k1sJCoBQuyuD3MvtlFiYE7phw5+6dBw58eoIIYFNhkMpOZ57l31umsm1L5e1DzlO/r1eoaY4wxxvSYFsYYY4wxPaaFMcYYY0yPaWGMMcYY02NaGGOMMcb0mBbGGGOMMT2mhTHGGGNMj2lhjDHGGNNjWhhjjDHG9JgWxhhjjDE9poUxxhhjTI9pYYwxxhjTY1oYY4wxxvSYFsYYY4wxPaaFMa9B27dvZ2hoiKGhIYaGhhgaGmJoaIihoSGGhoYYGhpiZGSEX6bdu3fTa8qy5IwzzmDlypWsX7+eF7N7927mfOELX+CCCy7gl2379u0MDQ0xNDTE0NAQQ0NDDA0NMTQ0xNDQEENDQ4yMjHAg2L17Ny9m+/btDA0NMTQ0xNDQEENDQwwNDTE0NMTQ0BBDQ0OMjIxgzGtNC2Neg3bt2sXo6Cijo6OMjo4yOjrK6Ogoo6OjjI6OMjo6SlmW/DLs3LmTLMu455576CWPPvoog4ODlGXJIYccwtFHH83z2blzJ1mWcc899zDn9ttv56/+6q/4Zdu1axejo6OMjo4yOjrK6Ogoo6OjjI6OMjo6yujoKGVZ8uu0c+dOsizjnnvu4cXs2rWL0dFRRkdHGR0dZXR0lNHRUUZHRxkdHWV0dJSyLDHmtaaFMa9hW7Zsodvt0u126Xa7dLtdut0u3W6Xm266iV+G8fFxUkr0mh07djA5OcnVV1/N3/zN33DRRRfxfMbHx0kp8eu0ZcsWut0u3W6XbrdLt9ul2+3S7Xa56aab+HUaHx8npcTLsWXLFrrdLt1ul263S7fbpdvt0u12uemmmzDmtaaFMeZlmZqa4qWYnp7mleh0OkxPT/NiOp0Ov8jU1BSvVKfTYXp6ml+k0+kw67DDDuPV0Ol06HQ6vJjp6Wl+Vaampng1TU1NYYz55WhhjHlR119/PSeccAJ9fX0sWLCAvr4+vPfce++97G/Hjh28973vpa+vj/nz53PEEUfw2c9+ljlDQ0Ocf/75zFq9ejVHHXUUc7Zt28aKFSvo7+9n/vz5LF68mI0bNzI1NcWctWvXsn79ev7iL/6ChQsXcvDBB/PVr36VJ554gg996EMsXLiQBQsW0N/fz3vf+17quual2LZtGytWrKC/v5/58+ezePFiNm7cyNTUFLNWr17NunXrmLVu3ToGBgb49re/zS8yNDTE+eefz6zVq1dz1FFHsb+qqjjhhBOYN28e/f39rFixgl27drG/uq5ZuXIlfX19zJ8/n8WLF7Nx40amp6d5tV1//fWccMIJ9PX1sWDBAvr6+vDec++997K/tWvX8ra3vY3nuu666xgYGODb3/42s5544gk+9KEPsXDhQhYsWEB/fz/vfe97qeuaWUNDQ5x//vnMWr16NUcddRTGmJevhTHmBY2MjPDBD36QN73pTVx//fXceOONfOQjH2Hbtm2cfvrpdDodZo2Pj/Oe97yHBx54gL/8y7/kxhtv5OSTT+YTn/gEf/qnf8qss846izPPPJNZGzZs4NOf/jSzbr/9dlasWMEjjzzCyMgIN954I6tWreKSSy7h1FNPZc4zzzzD+Pg4F1xwAatWreKd73wnb33rW1m9ejW33norV1xxBTfffDNf+MIXqOuak046iaZpeCG33347K1as4JFHHmFkZIQbb7yRVatWcckll3Dqqacya8OGDaxbt45Z69at4/LLL2fJkiX8ImeddRZnnnkmszZs2MCnP/1p5uzdu5fTTz+d3/u932PLli18/OMf51vf+hbve9/7mLNjxw6WLVvGrl27GBkZ4Rvf+AZnn302l1xyCX/wB3/Aq2lkZIQPfvCDvOlNb+L666/nxhtv5CMf+Qjbtm3j9NNPp9PpMOeZZ55h9+7dPNfU1BQ//elPmZycZNbq1au59dZbueKKK7j55pv5whe+QF3XnHTSSTRNw1lnncWZZ57JrA0bNvDpT38aY8zL18KY17BNmzYxODjI4OAgg4ODDA4OMjg4yGWXXcacTZs2ceyxx3LbbbexZs0aVq9ezeWXX0673eaRRx5hx44dzPrwhz/MwoULueuuuzjnnHNYvXo1N9xwAyeddBKbNm1ienoa7z0nn3wys0455RTWr1/PrHPPPZeBgQHuuusuNmzYwOrVq7nmmmu45JJL2Lp1K5s3b2bOD37wA/78z/+cv/7rv2bbtm0cffTR3HnnnZxzzjkURcGqVas477zzuOqqqzjmmGP4wQ9+wAs599xzGRgY4K677mLDhg2sXr2aa665hksuuYStW7eyefNmTjnlFPI8Z1ae55xzzjkceeSR/CLee04++WRmnXLKKaxfv545+/bt45prruHKK69kzZo1XHbZZZx//vk88MAD3HvvvcwqioK+vj7uuusuNmzYwBlnnMEVV1zB5Zdfzs0338zf/u3f8lJs2rSJwcFBBgcHGRwcZHBwkMHBQS677DLmbNq0iWOPPZbbbruNNWvWsHr1ai6//HLa7TaPPPIIO3bs4OXYs2cPd955J+eccw5FUbBq1SrOO+88rrrqKo455hh+8IMf4L3n5JNPZtYpp5zC+vXreSk2bdrE4OAgg4ODDA4OMjg4yODgIJdddhnGvBa1MOY1bHp6msnJSSYnJ5mcnGRycpLJyUmmp6eZ8+CDD/Kd73yH5xoYGGDWU089xd69e/nOd77D+9//fhYvXsz+vvzlL7Nz5076+vr4RcbHx3nooYdYv349AwMD7O/CCy9k3rx5fPOb32TOvHnzWL9+PXP6+/tZsGAB1113HTfccAN79+5l1tq1a9m2bRsnnngiz2d8fJyHHnqI9evXMzAwwP4uvPBC5s2bxze/+U1eLfPmzWPt2rXs7z3veQ+zHnnkEZ544gnuuusu3v/+97N48WL2d/755zPrq1/9Ki/F9PQ0k5OTTE5OMjk5yeTkJJOTk0xPTzPnwQcf5Dvf+Q7PNTAwwKynnnqKl6O/v58FCxZw3XXXccMNN7B3715mrV27lm3btnHiiSfySk1PTzM5Ocnk5CSTk5NMTk4yOTnJ9PQ0xrwWtTDmNeyiiy5ibGyMsbExxsbGGBsbY2xsjI0bNzKn1Wrx0EMPsXHjRtauXcvy5ctZuHAhn/zkJ5lz5513Mmvp0qU811ve8haWLFnC83nooYeYtXTpUp7r4IMP5tBDD+X73/8+cw4++GD6+vqY09fXxzXXXMPjjz/OWWedhXOOFStWcMUVV/D444/zQh566CFmLV26lOc6+OCDOfTQQ/n+97/Pq+Xggw+m1Wqxv1arxZzx8XFm3XDDDQwMDDAwMMDAwAADAwMcddRRzNq9ezcvxUUXXcTY2BhjY2OMjY0xNjbG2NgYGzduZE6r1eKhhx5i48aNrF27luXLl7Nw4UI++clP8kr09fVxzTXX8Pjjj3PWWWfhnGPFihVcccUVPP744/zPuOiiixgbG2NsbIyxsTHGxsYYGxtj48aNGPNa1MIY84IuvfRSjj/+eD7/+c8zOTnJcccdx+bNm/nMZz7DnE6nw6yFCxfySs2bN4/n0+l0eCFnn302Dz/8MJI47bTT2L59Ox/96Ed585vfzPj4OC9m3rx5PJ9Op8Ov2plnnsnFF1/MxRdfzMUXX8zFF1/MxRdfzBe/+EXOO+88Xi2XXnopxx9/PJ///OeZnJzkuOOOY/PmzXzmM5/hlTr77LN5+OGHkcRpp53G9u3b+ehHP8qb3/xmxsfHMca8OloYY57Xrl27+NSnPsWyZct48sknuemmmxgZGWHNmjVMTU0x5/jjj2fW3XffzXONj49z6aWX8uijj/KLHH744cy67777eK7p6Wmefvpp3v72t/NCpqamOOSQQyiKgltuuYU9e/bwxS9+kWeffZZNmzbxfA4//HBm3XfffTzX9PQ0Tz/9NG9/+9v5VVmyZAmzXve619Fut2m327TbbdrtNu12mz/6oz/itNNO49Wwa9cuPvWpT7Fs2TKefPJJbrrpJkZGRlizZg1TU1P8Ivv27eO5Ukrsb2pqikMOOYSiKLjlllvYs2cPX/ziF3n22WfZtGkTxphXRwtjzPPauXMns1atWkV/fz/7+8Y3vsGsqakpFi9ezDHHHMPtt9/O3r172V8IgYsvvphWq8X+Op0Os5YvX87hhx/O5s2bmZqaYn+jo6PMzMywbNkyns8tt9zCggULuPbaa5nT19fHeeedx/z58+l0Ojyf5cuXc/jhh7N582ampqbY3+joKDMzMyxbtoxXqtPp8HK87W1v43d/93e58cYb+dnPfsb+br31VhYtWsTHPvYxXg07d+5k1qpVq+jv72d/3/jGN5g1NTXFnP7+fpqmoWka9rd161bm3HLLLSxYsIBrr72WOX19fZx33nnMnz+fTqfD/jqdDsaYV6aFMeZ5LV26lAULFhBCYPv27UxNTbF9+3ZWrlzJD3/4Q2Z1Oh1mXX755TzyyCOceuqp3H777ezYsYONGzdy7bXXsmHDBo444ghm9ff3M2t0dJTrrruOVqvF5z73Oe677z5WrlzJbbfdxr333suVV17Jhz/8YY455hiKouD5DA4OsmTJEj7xiU/wpS99ifHxccqy5AMf+AD79u1jzZo1PJ9Wq8XnPvc57rvvPlauXMltt93Gvffey5VXXsmHP/xhjjnmGIqi4OXq7+9n1ujoKNdddx0vx9VXX81jjz3GihUruOWWW9ixYwdf/vKXWbduHYcffjgXXnghr4alS5eyYMECQghs376dqakptm/fzsqVK/nhD3/IrE6nw5yTTjqJmZkZ/vAP/5DbbruNW2+9lVNOOYUf//jHzBkcHGTJkiV84hOf4Etf+hLj4+OUZckHPvAB9u3bx5o1a5jV39/PrNHRUa677jqMMS9fC2PM8zriiCPYsmULe/fuZdmyZSxYsIAVK1Zw7LHHcscddzDr7rvvZtaqVav42te+xq5du3jf+97Hu971Lj772c9y4YUXEkJgzqmnnsrSpUv5+te/zrp165iammL9+vV85Stf4YEHHuD000/n+OOP52Mf+xhr1qzhjjvuYOHChTyfVqvF2NgYxx13HOeeey7vfve7WblyJWVZcvXVV7NmzRpeyPr16/nKV77CAw88wOmnn87xxx/Pxz72MdasWcMdd9zBwoULeblOPfVUli5dyte//nXWrVvH1NQUL9WqVau4+eabeeaZZ3j/+9/Pu971Lv74j/+Yt771rVRVxeLFi3k1HHHEEWzZsoW9e/eybNkyFixYwIoVKzj22GO54447mHX33Xcz54ILLuBP/uRPuP322zn99NP5/d//fQ499FCuuuoq5rRaLcbGxjjuuOM499xzefe7383KlSspy5Krr76aNWvWMOvUU09l6dKlfP3rX2fdunVMTU1hjHl5WhjzGnT22WfT7XZZs2YNL+aMM87g8ccf53vf+x733HMPe/fu5aqrruLEE0+k2+1y6aWXMufMM8/k4Ycf5v777+fOO+9kz549XHHFFbRaLeYceuihfPe732VycpJ9+/bR39/PrLVr1/Lwww9z//33861vfYs9e/awefNmBgYGmHPrrbfy9NNP81xLlixh27ZtTE5OsnXrVu677z6eeOIJLrjgAl6KtWvX8vDDD3P//ffzrW99iz179rB582YGBgaYc8YZZ9DtdjnjjDN4MYceeijf/e53mZycZN++ffT393Prrbfy9NNP81xr1qyh2+1y2mmnMWfVqlU8+OCD/OM//iNbt27lySefZPv27bz97W/nxZx99tl0u13WrFnDiznjjDN4/PHH+d73vsc999zD3r17ueqqqzjxxBPpdrtceumlzGm1WoyMjLBnzx7+7u/+jp/+9Kd87WtfY+3atXS7XfI8Z9aSJUvYtm0bk5OTbN26lfvuu48n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mc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnN3/mDyv+m8nf+cGZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNm87N++Vm//KxfftYvP+uXn/XLz/rlZ/3ys375Wb/8rF9+1i8/65ef9cvP+uVn/fKzfvlZv/ysX37WLz/rl5/1y5nNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2Zzd/5g8r/pPJ3/nBmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2ZzZnNmc2bzd/6g8u9a/IuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKyv9HRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUXl/6KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyn1gkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWMWSZIkj1kkSZI8ZpEkSfKYRZIkyWP+G/womKXYd6phAAAAAElFTkSuQmCC" style="width: 100%; height: auto;"></div></div></div></div></div></div></div><div class = 'S8'><span></span></div><h3 class = 'S2' id = 'H_C5C21250' ><span>1.4 About Sparsity!</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>Three functions of the Faust class are here to evaluate the sparsity of a Faust object.</span></div><div class = 'S0'><span>Let's call the first one:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>nnz_sum(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 155</div></div></div></div><div class = 'S8'><span>I'm sure you guessed exactly what the function returns, if you doubt it, here is the doc: </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a7dc7f3cb86b02b3c2cd725387c34300d"><span>Faust.nnz_sum()</span></a><span>. The smaller </span><span style=' font-family: monospace;'>nnz_sum</span><span>, the sparser the Faust.</span></div><div class = 'S0'><span>Next comes the function: </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#ac33ff53bbff16f93666acec05031511b"><span>Faust.density()</span></a><span>.</span></div><div class = 'S0'><span>This function along with its reciprocal </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#aff3261319b63c49d51a699726edc74bc"><span>Faust.rcg()</span></a><span> can give you a big hint on how much your Faust is potentially optimized both for storage and calculation. The sparser the Faust, the larger the Relative Complexity Gain (RCG)!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>density(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 3.1000</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>rcg(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.3226</div></div></div></div><div class = 'S8'><span>According to its RCG, this Faust doesn't seem to be of any help for optimization but look at the graphic the next script generates:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>figure()</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>nfactors = 3;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>startd = 0.01;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>endd = 1;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>dim_sz = 1000;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>ntests = 10;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>sizes = zeros(ntests, 1);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>rcs = zeros(ntests, 1);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>densities = linspace(startd, endd, ntests);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">for </span><span>i=1:ntests</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> d = densities(i);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> F = matfaust.rand(dim_sz, dim_sz, </span><span style="color: rgb(160, 32, 240);">'num_factors'</span><span>, nfactors, </span><span style="color: rgb(160, 32, 240);">'density'</span><span>, d, </span><span style="color: rgb(160, 32, 240);">'fac_type'</span><span>, </span><span style="color: rgb(160, 32, 240);">'sparse'</span><span>);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> sizes(i) = nbytes(F);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> rcs(i) = density(F);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">end</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>plot(rcs, sizes)</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>legend(</span><span style="color: rgb(160, 32, 240);">'size'</span><span>)</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>xlabel(</span><span style="color: rgb(160, 32, 240);">'Density'</span><span>)</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>ylabel(</span><span style="color: rgb(160, 32, 240);">'Faust Size (bytes)'</span><span>)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsFigure" uid="A93C84D1" data-testid="output_13" style="width: 1202px;"><div class="figureElement"><div class="figureContainingNode" style="width: 560px; max-width: 100%; display: inline-block;"><div class="GraphicsView" data-dojo-attach-point="graphicsViewNode,backgroundColorNode" id="uniqName_197_60" widgetid="uniqName_197_60" style="width: 100%; height: auto;"><img class="ImageView figureImage" data-dojo-attach-point="imageViewNode" draggable="false" ondragstart="return false;" id="uniqName_197_62" widgetid="uniqName_197_62" src="data:image/png;base64,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NTUxbtw4DtX27dtZsGABixYt4qSTTuLZtm/fzsyZM/nqV7/KfffdR19fH/fccw+33norB9PU1ERTUxNNTU00NTURQgj1ZM2GHXT0DFJT6mqjubGBMHo1NTXR1NREU1MTTU1NjFQJdeCqq67i9a9/PaeddhqPPPIIHR0dvOlNb2JwcJB8PmYryccAACAASURBVM+h+sUvfkF7ezsXXHABnZ2dHMjxxx/P9ddfz/HHH0/Ncccdx1lnncWDDz5ICCEMJ+VKlVy+REfPepaefzLZTIoQRouEOrF8+XLWrFnD7bffzvLly7nzzjt56KGHGDt2LIfivvvu48ILL+Sqq66io6ODg9m0aRO33347+3vmmWc46qijCCGE4aJcqZLuLlBT6mqjubGBEEaThDowa9Ystm7dyqRJk3jDG97AqaeeygknnMDOnTs5+eSTefrpp3kujz/+OJdddhmf//znSafT7N69m927d7Nnzx5q1q1bx9atW6mpVqtks1kee+wxarZv385dd93FueeeSwghDAe5fIl0d4EFUyeRzaQIYTRKGCL9/f3MnTuXuXPn8uijj/KRj3yEuXPnMnfuXObOncvcuXOZP38+e/bsYcyYMTyXW265haeeeopLL72UU045hVNOOYVTTjmFq6++mpprr72WtWvXUjNlyhS6urp497vfzfz583nHO97BxRdfzOmnn04IIdSzcqVKR8961mzYQV9nC9lMihBGq4Qh0traSrVaZdu2bdRs27aNbdu2sW3bNrZt28a2bdt46qmnuOKKKzjqqKN4LpdffjnFYpFisUixWKRYLFIsFrnyyiupWbp0Keeddx77zJ07l0KhwPLlyykUCnR0dBBCCPVs2QNb6egZpHliA32LWmhubCCE0SxhCH3nO99h9erVTJs2jW9961usXr2a1atXs3r1alavXs2dd95JR0cHIYQwWpUrVXL5Erk7Syw9/2SymRQhBEioA5s2beLcc8/li1/8Ijt37iSEEAKUK1XS3QVqSl1tNDc2EEL4Xwl1oLe3l2w2yx133MFb3vIWZsyYQW9vLyGEMBqVK1Vy+RLp7gILpk4im0kRQvhzCXVg7NixnHvuudx999385Cc/4ZxzzuHKK69kypQpzJ07ly1bthBCCKNBuVKlo2eQNRt20NfZQjaTIoTwlxLqTGNjI/PmzeOcc85hzJgxPPjgg8yc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117j3//934lEIjz88MN0dHSwaNEivv/973MmJkyYQG1tLc888wy/+MUvuPPOOxGR0hQgInKG+vv72b59O9u3b6ezs5MNGzYwf/58PvOZz/C3f/u3TJs2jY9//OMsX76co0ePUtTR0UFTUxODg4O8n9///vf8/d//Pbt27aLoxIkTvP7661x77bW8m1AoxIEDBzhy5Agn3XnnnWzZsoVcLkd9fT0iUpoCRETO0PPPP09TUxNNTU185Stf4Uc/+hF33nknra2thEIhgiCgtbWVfD5PTU0Nn/3sZ/na177GN77xDW677TbeT21tLYsXL+buu+/ms5/9LDfccAMDAwN897vf5d3cdttt7Nixg7/4i7/gpL/+67/md7/7HbNmzWLUqFGISGkKEBE5A11dXfT29tLb20tvby89PT0888wz3HfffVx22WWc9PGPf5wf//jH/OY3vyGZTJJOp/nSl77ESb29vUyfPp1T9fb2Mn36dIqWLFnCSy+9RDKZJJVKsXnzZsaPH89Jvb29TJ8+naI5c+bw8ssv85vf/IaTgiAgFArx+c9/HhEpXQEiIufAxRdfzLhx4wiCgA8qCALGjRvHqFGjeD9BEBAKhThy5Aj5fJ6VK1dy1VVXMWXKFESkdAWIiJSIm2++mZ/85Cd885vfRERKW4CISAm44oor+M1vfsOvfvUrpkyZgoiUtgARkRJx6aWXEgqFEJHSFyAiIiIywgSIiIiIjDD/A04XMlm00bnKAAAAAElFTkSuQmCC" style="width: 100%; height: auto;"></div></div></div></div></div></div></div><div class = 'S8'><span>Isn't it obvious now that the smaller the density the better?! Indeed, for two Faust objects of the same shape and the same number of factors, a smaller density (linearly) implies a smaller file size for storage. This point applies also to the memory (RAM) space to work on a Faust.</span></div><div class = 'S0'><span>We'll see later how the computation can benefit of a bigger RCG (or smaller density). But let's point out right now that the sparsity is often a tradeoff with accuracy, as the following plot shows about the truncated SVD of a matrix </span><span style="vertical-align:-5px"><img src="data:image/png;base64,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" width="85" height="19" /></span><span>. Note beforehand that the SVD of M (truncated or not) can be seen as a Faust which approximates M.</span></div><div class = 'S0'><span></span></div><div class = 'S0'><img src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAABILUlEQVR42u2dCXgV5dm/i2EVBFGw4EJitUDUfgha1KpBXEDcxX5qtUi1oqBAUKriUsF+4FpF60e1Iu4iVYl1LWpVoLJpBVzKvi/ijp8bi+Lz7+9t3/znTGbOkgRykrnv65oryck5c2Z55n3uebf5gQEAAABAovgBhwAAAAAAAQQAAAAABBAAAAAAEEAAAAAAQAABAAAAAAEEAAAAAAQQAAAAABBAAAAAAEAAAQAAAAABBAAAAAAEEAAAAAAQQAAAAABAAAEAAAAAAQQAAABAAO+//377wQ9+UL4UFBRYmzZt7IwzzrBFixZV+guGDx/u1lcZnn/+eff5KAoLC61v377b/IB169Yt5TgFF21TUgnHT6NGjeyHP/yhHXHEEXb99dfbhx9+mD9B/6/tC8bVP//5T/f38uXLa2ybJkyYYPvss481btzYbd+cOXMiYz4u9oKLzkVt54477rCHH3642te7YcMGd4xuuOGGjO9VPFxwwQW29957u/PSsmVL+8lPfuJee//99917iouLbc8997Tvv/8+dj1dunSxtm3b2nfffWfz589POVf169e3nXfe2bp27WqXXnqp+3918te//tU6d+5s22+/vfs+/V3bOOigg6xnz55k6yx58MEH7c4778zpMz4uH3vssWqLOx/jces85JBD3P87dOiQ9XoPPfRQKy0trbDdUctTTz2V8tnXXnvNzjvvPHc9NGzY0L1n3bp1Fb5j3rx5NmTIENt///2tefPm7vo87LDDKqwvF6644orIbWzRokWF995888128sknW7t27dx74mL/z3/+s51++umu/FH5VFRUZH369LGlS5emvG/jxo22++6721133ZVZAPVzxowZ7mCNHDnSmjRpYrvssot99tln21wAL7744tjPzp4925YsWVIjAvijH/3IHaPwom1KugD6+Jk6dao9+eST7kJSkO+000728ssv58W2avtWr15d/vcTTzzhtl0xXxN89NFH1qBBAzvxxBNt8uTJbvu+/vrryJgPxtuvf/1rt92TJk1KeV3rq+3stddeWyXpZyuAy5Ytc8LXsWNH+9Of/mSvvvqqlZWV2f/8z/84CdRxFrfccotb3yuvvBK5nrffftv9f9iwYSkJa+jQoW4d06ZNs2effdauu+46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7if7xT6xT+wT54p9Yp8AAQQAAAAABBAAAAAAEEAAAAAAQAABAAAAEEDYhowZM8aKioqsUaNG1qVLF5s6dWra9z/55JNWXFxsDRs2dD/LyspS/v/999+7Drht27a1xo0bW7du3ey9997L232655577LDDDrMdd9zRLUcddZTNmjUr5T19+/atMCP8QQcdlLf7dP/990fOYr9hw4Yqnfua3i/FUtR+HXfccXlzrqZMmWInnHCCi39991NPPZXxM5MnT3b7rmOw55572l133VXl67Qm92nixIl29NFHW6tWrWyHHXawgw8+2CZNmpTyHpUR4fP0wx/+MG/36bXXXouMvfnz5+dUPubTPkVdK1r22WefvDlP119/vR144IHWrFkza926tZ188sm2YMGCjJ+rDXkKEMAaZcKECdagQQMbO3aszZs3z0pLS61p06a2cuXKyPdPnz7dCgoK3EWpgk8/69evbzNnzix/z4033ugKfSWBd99918444wx3kX3xxRd5uU9nnXWWS65z5sxx+3TuuedaixYtbM2aNSkF5bHHHmvr1q0rXz799NO8PU8SwObNm6dsr5aqrDMf9kvHPLg/KrAVj9rffDlXL7zwgl199dUu/rNJwsuWLbPtt9/e7buOgY6FjokSWL6cq1z3Sdt300032RtvvGGLFi2yK6+80m3/7NmzU8Ri3333TTlPH330Ud6eJy+ACxcuTNnm7777LqfyMZ/2SU+3CO6LnnSx0047uXOTL+epZ8+e7vrWtT537lw7/vjjrV27dvbVV1/FfqY25ClAAGucrl27Wv/+/VNe69ixow0bNizy/aeffrpLruEL9Mwzzyy/q2rTpo27uDwaii+huvvuu/Nyn8KoQFfB8OCDD6ZIhe48a8t5UoGpY741j1M+nKvRo0e7cxVMBjV9rlIKtiyS8OWXX+72OciFF17oas3y6Vzlsk9RqFbpuuuuSxGLTp061Zrz5AVw/fr1se/JVD7m+3nS++vVq2crVqzIy/MkJJ/aN9V2VvY85EOeAgSwRtm0aZO7SwpXjQ8ePNhKSkoiP7PHHnvYbbfdlvKa/tYdmVi6dKm7OIN3+uKkk06yc845Jy/3KYzuANUk8Oyzz6ZIhQoHNUH8+Mc/tvPPP98+/PDDvD1PEkB9Rudlt912c3fNwXNSHccpH87VfvvtZ/369Ut5rSbPVWWS8OGH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eOGF7veysjK3vq+//poTCQAIIABAdQjgT37yEzv++OPtxhtvtN12280WL15cYfn444/LBVBNxkFGjx7t+gN61JT8+uuv27XXXuvWrdo79e3LRQCfeeYZa9GihX3zzTeuSfr888/nJAIAAggAUB0C6AeB3HffffbSSy+5plf13YsjGwEMohpBSeWtt94auR3HHHOMDRw4MPJzu+66q/uc+hROnz6dkwgACCAAQK4CGDcNzAknnOCESzV3hx12mBO8SZMmORGcNm2aXX311W5QSDYCOHPmTLdevX/lypX2+OOPW8OGDe2FF16IFEANAPnpT3/qvku1jME5CTWwRJ/t2LEjJxAAEEAAgMoIYHAiaDXLaiJo1fwFpUuDOwYNGuRq3xo0aGB77LGHnX322bZq1aqsBHDevHnWs2dPt/5GjRpZ+/bt7c4770zZjqAALly40A4++GBr0qSJ27Zg7ePSpUvda+qbCACAAAIAJAD1I5SsfvDBBxwMAEAAAQDqMpqGRgNPNAn1WWedxQEBAAQQAKCuc//997upZ7p06eL6KwIAIIAAAAAAgAACAAAAAAIIAAAAAAggAAAAACCAAAAAAIAAAgAAAAACCAAAAAAIIAAAAAAggAAAAAAIIAAAAAAggAAAAACAAAIAAAAAAggAAAAACCAAAAAAIIAAAAAAkBf8PwxregtdjfnYAAAAAElFTkSuQmCC" width = "524" height = "425" alt = "" style = "vertical-align: baseline"></img></div><div class = 'S0'><span>Here is the script to reproduce the last figure with pyfaust: </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/test_svd_rc_vs_err.py"><span>test_svd_rc_vs_err.py</span></a></div><div class = 'S0'><span></span></div><h3 class = 'S2' id = 'H_73387A87' ><span>2. Faust Algebra and other Operations</span></h3><div class = 'S0'><span></span></div><div class = 'S0'><span>In order to write some nice algorithms using Faust objects, you'll have to use the basic "stable" operations a Faust is capable of. Let's make a tour of them.</span></div><div class = 'S0'><span></span></div><h4 class = 'S12' id = 'H_5E556DD4' ><span>2.1 Transpose, conjugate, transconjugate</span></h4><div class = 'S0'><span></span></div><ul class = 'S3'><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a029a3db751ae1282eca2af94ce4101ec"><span>Faust.transpose</span></a><span> or </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a029a3db751ae1282eca2af94ce4101ec"><span>.'</span></a></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#aec9036a3d251fd47038a9a338b91502d"><span>Faust.conj</span></a><span>,</span></li><li class = 'S4'><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a66c1abdcbcfe8505457ce69a7b355716"><span>Faust.ctranspose</span></a><span> or </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#a66c1abdcbcfe8505457ce69a7b355716"><span>'</span></a></li></ul><div class = 'S0'><span>You are probably familiar with .' and ' shorthand operators from Matlab. Well, they are also used in the Faust class.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>G = matfaust.rand(10, 15, </span><span style="color: rgb(160, 32, 240);">'dim_sizes'</span><span>, [10,15], </span><span style="color: rgb(160, 32, 240);">'field'</span><span>, </span><span style="color: rgb(160, 32, 240);">'complex'</span><span>)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="AC55DEF9" data-testid="output_14" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">G = </span></div><div>Faust size 10x15, density 2, nnz_sum 300, 5 factor(s): +- FACTOR 0 (complex) SPARSE, size 10x10, density 0.5, nnz 50 +- FACTOR 1 (complex) SPARSE, size 10x15, density 0.333333, nnz 50 +- FACTOR 2 (complex) SPARSE, size 15x14, density 0.357143, nnz 75 +- FACTOR 3 (complex) SPARSE, size 14x11, density 0.454545, nnz 70 +- FACTOR 4 (complex) SPARSE, size 11x15, density 0.333333, nnz 55</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>G.'</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="E84D10E7" data-testid="output_15" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 15x10, density 2, nnz_sum 300, 5 factor(s): +- FACTOR 0 (complex) SPARSE, size 15x11, density 0.333333, nnz 55 +- FACTOR 1 (complex) SPARSE, size 11x14, density 0.454545, nnz 70 +- FACTOR 2 (complex) SPARSE, size 14x15, density 0.357143, nnz 75 +- FACTOR 3 (complex) SPARSE, size 15x10, density 0.333333, nnz 50 +- FACTOR 4 (complex) SPARSE, size 10x10, density 0.5, nnz 50</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>conj(G)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="A724B623" data-testid="output_16" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x15, density 2, nnz_sum 300, 5 factor(s): +- FACTOR 0 (complex) SPARSE, size 10x10, density 0.5, nnz 50 +- FACTOR 1 (complex) SPARSE, size 10x15, density 0.333333, nnz 50 +- FACTOR 2 (complex) SPARSE, size 15x14, density 0.357143, nnz 75 +- FACTOR 3 (complex) SPARSE, size 14x11, density 0.454545, nnz 70 +- FACTOR 4 (complex) SPARSE, size 11x15, density 0.333333, nnz 55</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>G'</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="12FBB89A" data-testid="output_17" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 15x10, density 2, nnz_sum 300, 5 factor(s): +- FACTOR 0 (complex) SPARSE, size 15x11, density 0.333333, nnz 55 +- FACTOR 1 (complex) SPARSE, size 11x14, density 0.454545, nnz 70 +- FACTOR 2 (complex) SPARSE, size 14x15, density 0.357143, nnz 75 +- FACTOR 3 (complex) SPARSE, size 15x10, density 0.333333, nnz 50 +- FACTOR 4 (complex) SPARSE, size 10x10, density 0.5, nnz 50</div></div></div></div></div></div><div class = 'S8'><span>What really matters here is that the results of G.', conj(G) and G' are all Faust objects. Behind the scene, there is just one memory zone allocated to the factors. Strictly speaking they are memory views shared between G, G.' and G'. So don't hesitate to use!</span></div><h4 class = 'S12' id = 'H_99DA98B4' ><span>2.2 Add, Subtract and Multiply</span></h4><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>s = size(G, 1);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>F = matfaust.rand(s, s);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>G = matfaust.rand(s, s, </span><span style="color: rgb(160, 32, 240);">'field'</span><span>, </span><span style="color: rgb(160, 32, 240);">'complex'</span><span>);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>F+G</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="7E0B4540" data-testid="output_18" data-width="1172" data-height="146" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 5.6, nnz_sum 560, 8 factor(s): - FACTOR 0 (complex) SPARSE, size 10x20, density 0.1, nnz 20 - FACTOR 1 (complex) SPARSE, size 20x20, density 0.25, nnz 100 - FACTOR 2 (complex) SPARSE, size 20x20, density 0.25, nnz 100 @@ -128,7 +137,7 @@ - FACTOR 4 (complex) SPARSE, size 20x20, density 0.25, nnz 100 - FACTOR 5 (complex) SPARSE, size 20x20, density 0.25, nnz 100 - FACTOR 6 (complex) SPARSE, size 20x20, density 0.05, nnz 20 -- FACTOR 7 (complex) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div></div><div class = 'S8'><span>Go ahead and verify it's accurate.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>norm(full(F+G)-(full(F)+full(G)), </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0</div></div></div></div><div class = 'S8'><span>Some points are noticeable here:</span></div><ul class = 'S3'><li class = 'S4'><span>F is real but G is complex. The Faust API is able to return the proper type for the resulting Faust, that is a complex Faust.</span></li><li class = 'S4'><span>F+G is composed of 8 factors, however F and G are both 5 factors long. It's due to the way the addition is implemented (Faust concatenation is hiding behind).</span></li></ul><div class = 'S0'><span>Subtracting is not different:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F-G</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="C29FC773" data-scroll-top="null" data-scroll-left="null" data-testid="output_18" data-width="926" data-height="146" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 5.6, nnz_sum 560, 8 factor(s): +- FACTOR 7 (complex) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div></div><div class = 'S8'><span>Go ahead and verify it's accurate.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>norm(full(F+G)-(full(F)+full(G)), </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0</div></div></div></div><div class = 'S8'><span>Some points are noticeable here:</span></div><ul class = 'S3'><li class = 'S4'><span>F is real but G is complex. The Faust API is able to return the proper type for the resulting Faust, that is a complex Faust.</span></li><li class = 'S4'><span>F+G is composed of 8 factors, however F and G are both 5 factors long. It's due to the way the addition is implemented (Faust concatenation is hiding behind).</span></li></ul><div class = 'S0'><span>Subtracting is not different:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F-G</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="D4A009EC" data-testid="output_20" data-width="1172" data-height="146" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 5.6, nnz_sum 560, 8 factor(s): - FACTOR 0 (complex) SPARSE, size 10x20, density 0.1, nnz 20 - FACTOR 1 (complex) SPARSE, size 20x20, density 0.25, nnz 100 - FACTOR 2 (complex) SPARSE, size 20x20, density 0.25, nnz 100 @@ -136,7 +145,7 @@ - FACTOR 4 (complex) SPARSE, size 20x20, density 0.25, nnz 100 - FACTOR 5 (complex) SPARSE, size 20x20, density 0.25, nnz 100 - FACTOR 6 (complex) SPARSE, size 20x20, density 0.05, nnz 20 -- FACTOR 7 (complex) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div></div><div class = 'S8'><span>You can also add/subtract scalars to Faust objects.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F+2</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="D9F87807" data-scroll-top="null" data-scroll-left="null" data-testid="output_19" data-width="926" data-height="146" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 3.6, nnz_sum 360, 8 factor(s): +- FACTOR 7 (complex) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div></div><div class = 'S8'><span>You can also add/subtract scalars to Faust objects.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F+2</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="14F2FB7F" data-testid="output_21" data-width="1172" data-height="146" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 3.6, nnz_sum 360, 8 factor(s): - FACTOR 0 (real) SPARSE, size 10x20, density 0.1, nnz 20 - FACTOR 1 (real) SPARSE, size 20x20, density 0.15, nnz 60 - FACTOR 2 (real) SPARSE, size 20x20, density 0.15, nnz 60 @@ -144,7 +153,7 @@ - FACTOR 4 (real) SPARSE, size 20x11, density 0.272727, nnz 60 - FACTOR 5 (real) SPARSE, size 11x20, density 0.272727, nnz 60 - FACTOR 6 (real) SPARSE, size 20x20, density 0.05, nnz 20 -- FACTOR 7 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div></div><div class = 'S8'><span>Note that here again </span><span style=' font-family: monospace;'>numfactors(F+2) ~= numfactors(F)</span><span>.</span></div><div class = 'S0'><span>The FAµST API supports equally the Faust to array addition and subtraction.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F+full(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="B8F7A944" data-scroll-top="null" data-scroll-left="null" data-testid="output_20" data-width="926" data-height="146" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 4.5, nnz_sum 450, 8 factor(s): +- FACTOR 7 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div></div><div class = 'S8'><span>Note that here again </span><span style=' font-family: monospace;'>numfactors(F+2) ~= numfactors(F)</span><span>.</span></div><div class = 'S0'><span>The FAµST API supports equally the Faust to array addition and subtraction.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F+full(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="2C5F3993" data-testid="output_22" data-width="1172" data-height="146" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 4.5, nnz_sum 450, 8 factor(s): - FACTOR 0 (real) SPARSE, size 10x20, density 0.1, nnz 20 - FACTOR 1 (real) SPARSE, size 20x20, density 0.15, nnz 60 - FACTOR 2 (real) SPARSE, size 20x20, density 0.15, nnz 60 @@ -152,7 +161,7 @@ - FACTOR 4 (real) SPARSE, size 20x20, density 0.15, nnz 60 - FACTOR 5 (real) SPARSE, size 20x20, density 0.375, nnz 150 - FACTOR 6 (real) SPARSE, size 20x20, density 0.05, nnz 20 -- FACTOR 7 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>F-full(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="9AECB800" data-scroll-top="null" data-scroll-left="null" data-testid="output_21" data-width="926" data-height="146" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 4.5, nnz_sum 450, 8 factor(s): +- FACTOR 7 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>F-full(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="BFD13945" data-testid="output_23" data-width="1172" data-height="146" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 4.5, nnz_sum 450, 8 factor(s): - FACTOR 0 (real) SPARSE, size 10x20, density 0.1, nnz 20 - FACTOR 1 (real) SPARSE, size 20x20, density 0.15, nnz 60 - FACTOR 2 (real) SPARSE, size 20x20, density 0.15, nnz 60 @@ -160,8 +169,8 @@ - FACTOR 4 (real) SPARSE, size 20x20, density 0.15, nnz 60 - FACTOR 5 (real) SPARSE, size 20x20, density 0.375, nnz 150 - FACTOR 6 (real) SPARSE, size 20x20, density 0.05, nnz 20 -- FACTOR 7 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>all(all(full(F-full(F)) < eps))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="E4420FE8" data-scroll-top="null" data-scroll-left="null" data-testid="output_22" data-width="926" data-height="34" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 -</div></div></div></div></div></div><div class = 'S8'><span>Now let's multiply these Fausts!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>FG = F*G</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="E58E2DE6" data-scroll-top="null" data-scroll-left="null" data-testid="output_23" data-width="926" data-height="174" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">FG = </span></div><div>Faust size 10x10, density 5, nnz_sum 500, 10 factor(s): +- FACTOR 7 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>all(all(full(F-full(F)) < eps))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="8C11953E" data-testid="output_24" data-width="1172" data-height="34" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 +</div></div></div></div></div></div><div class = 'S8'><span>Now let's multiply these Fausts!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>FG = F*G</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="6F48C590" data-testid="output_25" data-width="1172" data-height="174" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">FG = </span></div><div>Faust size 10x10, density 5, nnz_sum 500, 10 factor(s): - FACTOR 0 (complex) SPARSE, size 10x10, density 0.5, nnz 50 - FACTOR 1 (complex) SPARSE, size 10x10, density 0.5, nnz 50 - FACTOR 2 (complex) SPARSE, size 10x10, density 0.5, nnz 50 @@ -171,134 +180,129 @@ - FACTOR 6 (complex) SPARSE, size 10x10, density 0.5, nnz 50 - FACTOR 7 (complex) SPARSE, size 10x10, density 0.5, nnz 50 - FACTOR 8 (complex) SPARSE, size 10x10, density 0.5, nnz 50 -- FACTOR 9 (complex) SPARSE, size 10x10, density 0.5, nnz 50</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(FG)-full(F)*full(G))/norm(full(F)*full(G))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 9.0371e-17</div></div></div></div><div class = 'S8'><span>Faust scalar multiplication is also available and here again the result is a Faust object!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F*2</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="A81640D3" data-scroll-top="null" data-scroll-left="null" data-testid="output_25" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 2.5, nnz_sum 250, 5 factor(s): +- FACTOR 9 (complex) SPARSE, size 10x10, density 0.5, nnz 50</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(FG)-full(F)*full(G))/norm(full(F)*full(G))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 9.0087e-17</div></div></div></div><div class = 'S8'><span>Faust scalar multiplication is also available and here again the result is a Faust object!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F*2</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="660C3353" data-testid="output_27" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 2.5, nnz_sum 250, 5 factor(s): - FACTOR 0 (real) SPARSE, size 10x10, density 0.5, nnz 50 - FACTOR 1 (real) SPARSE, size 10x10, density 0.5, nnz 50 - FACTOR 2 (real) SPARSE, size 10x10, density 0.5, nnz 50 - FACTOR 3 (real) SPARSE, size 10x10, density 0.5, nnz 50 -- FACTOR 4 (real) SPARSE, size 10x10, density 0.5, nnz 50</div></div></div></div></div></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S13'></div></div></div><h4 class = 'S12'><span>2.3 Faust Multiplication by a Vector or a Matrix</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>When you multiply a Faust by a vector or a matrix (the number of nrows must match the number of Faust columns), you'll get respectively a vector or a matrix as result.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>vec = rand(size(F, 2), 1);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>F*vec</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="4F797A9E" data-scroll-top="null" data-scroll-left="null" data-testid="output_26" data-width="926" style="width: 956px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 926px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">10×1</span></div><div class="valueContainer" data-layout="{"columnWidth":73,"totalColumns":1,"totalRows":10,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 75px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 51.3618 - 56.8713 - 22.0841 - 32.4884 - 88.5154 - 47.7793 - 32.8079 - 56.8013 - 37.8312 - 51.6433 -</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div></div><div class = 'S8'><span>Let's launch a timer to compare the execution times of Faust-vector multiplication and Faust's dense matrix-vector multiplication.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F_times_vec = @() F*vec</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="4DCA0829" data-scroll-top="null" data-scroll-left="null" data-testid="output_27" data-width="926" data-height="34" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">F_times_vec = <span class="headerElement">function_handle with value:</span></span></div><div> @()F*vec -</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'><span style="white-space: pre;"><span>FD = full(F);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>FD_times_vec = @() FD*vec</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="B27D8619" data-scroll-top="null" data-scroll-left="null" data-testid="output_28" data-width="926" data-height="34" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">FD_times_vec = <span class="headerElement">function_handle with value:</span></span></div><div> @()FD*vec -</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(F_times_vec)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 2.0105e-05</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(FD_times_vec)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsWarningElement" uid="4630EE03" data-scroll-top="null" data-scroll-left="null" data-testid="output_30" data-width="926" data-height="18" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="diagnosticMessage-wrapper diagnosticMessage-warningType"><div class="diagnosticMessage-messagePart">Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.</div><div class="diagnosticMessage-stackPart"></div></div></div><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 2.0919e-07</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>all(all(F*vec-FD*vec < 1e-7))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="F0AC2975" data-scroll-top="null" data-scroll-left="null" data-testid="output_32" data-width="926" data-height="34" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 -</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>rcg(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.4000</div></div></div></div><div class = 'S8'><span>When the RCG is lower than 1 the Faust-vector multiplication is slower. Making a random Faust with a large RCG (small density) shows better results.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>G = matfaust.rand(1024, 1024, </span><span style="color: rgb(160, 32, 240);">'num_factors'</span><span>, 3, </span><span style="color: rgb(160, 32, 240);">'density'</span><span>, .001, </span><span style="color: rgb(160, 32, 240);">'fac_type'</span><span>, </span><span style="color: rgb(160, 32, 240);">'sparse'</span><span>)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="4664C7A3" data-scroll-top="null" data-scroll-left="null" data-testid="output_34" data-width="926" data-height="76" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">G = </span></div><div>Faust size 1024x1024, density 0.00292969, nnz_sum 3072, 3 factor(s): -- FACTOR 0 (real) SPARSE, size 1024x1024, density 0.000976562, nnz 1024 -- FACTOR 1 (real) SPARSE, size 1024x1024, density 0.000976562, nnz 1024 -- FACTOR 2 (real) SPARSE, size 1024x1024, density 0.000976562, nnz 1024</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'><span style="white-space: pre;"><span>GD = full(G);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>vec2 = rand(1024, 1);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>timeit(@() G*vec2)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 4.9490e-05</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() GD*vec2)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 6.7963e-04</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>rcg(G)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 341.3333</div></div></div></div><div class = 'S8'><span>It goes without saying that a big RCG gives a big speedup to the Faust-vector multiplication relatively to the corresponding (dense) matrix-vector multiplication. I hope the example above has finished to convince you.</span></div><div class = 'S0'><span>Just to convince you as well of the Faust-vector multiplication accuracy:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>norm(G*vec2 - GD*vec2)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 4.3060e-16</div></div></div></div><div class = 'S8'><span>What applies to Faust-vector multiplication remains valid about Faust-matrix multiplication. Take a look:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>M = rand(1024,32);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>timeit(@() G*M)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 6.9088e-04</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() GD*M)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.0134</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(GD*M-G*M)/norm(GD*M)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 7.2196e-17</div></div></div></div><div class = 'S8'><span>Well, what do we see? A quicker Faust-matrix multiplication than the matrix-matrix corresponding multiplication, though a good accuracy of the Faust-matrix multiplication is also clearly confirmed.</span></div><div class = 'S0'><span>These examples are somehow theoretical because we cherry-pick the Faust to ensure that the RCG is good to accelerate the muplication, but at least it shows the potential speedup using Faust objects.</span></div><div class = 'S0'><span></span></div><h4 class = 'S12'><span>2.4 Faust Norms</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>The Faust class provides a norm function which handles different types of norms. This function is really close to Matlab </span><a href = "https://www.mathworks.com/help/matlab/ref/norm.htm"><span>norm</span></a><span> function.</span></div><div class = 'S0'><span>In the following example, three of the four norms available are computed.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>norm(F,1)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 204.5014</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(F, inf)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 219.4268</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(F, </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 142.4657</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(F), 1)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 204.5014</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(F), inf)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 219.4268</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(F), </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 142.4657</div></div></div></div><div class = 'S8'><span>Perfect! But a last norm is available, this is the Faust's 2-norm. Let's see in the next small benchmark how the Faust 2-norm is being computed faster than the Faust's dense matrix 2-norm.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>timeit(@() norm(G, 2))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 4.9805e-04</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() norm(GD, 2))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 2.2828</div></div></div></div><div class = 'S8'><span>The power-iteration algorithm implemented in the FAµ?ST C++ core is faster on G and the relative error is not bad too. The norm computation is faster as it benefits from faster Faust-vector multiplication.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>err = abs((norm(G, 2)-norm(GD,2))/norm(GD,2))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>err = 0.0012</div></div></div></div><div class = 'S8'><span></span></div><h4 class = 'S12'><span>2.5 Faust Normalizations</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>The FAµST API proposes a group of normalizations. They correspond to the norms available and discussed above.</span></div><div class = 'S0'><span>It's possible to normalize along columns or rows with any type of these norms.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F = matfaust.rand(5, 10)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="594C614F" data-scroll-top="null" data-scroll-left="null" data-testid="output_51" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">F = </span></div><div>Faust size 5x10, density 4, nnz_sum 200, 5 factor(s): -- FACTOR 0 (real) SPARSE, size 5x8, density 0.625, nnz 25 -- FACTOR 1 (real) SPARSE, size 8x9, density 0.555556, nnz 40 -- FACTOR 2 (real) SPARSE, size 9x10, density 0.5, nnz 45 -- FACTOR 3 (real) SPARSE, size 10x8, density 0.625, nnz 50 -- FACTOR 4 (real) SPARSE, size 8x10, density 0.5, nnz 40</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>NF = normalize(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="306E3EB9" data-scroll-top="null" data-scroll-left="null" data-testid="output_52" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">NF = </span></div><div>Faust size 5x10, density 4, nnz_sum 200, 5 factor(s): -- FACTOR 0 (real) SPARSE, size 5x8, density 0.625, nnz 25 -- FACTOR 1 (real) SPARSE, size 8x9, density 0.555556, nnz 40 -- FACTOR 2 (real) SPARSE, size 9x10, density 0.5, nnz 45 -- FACTOR 3 (real) SPARSE, size 10x8, density 0.625, nnz 50 -- FACTOR 4 (real) SPARSE, size 8x10, density 0.5, nnz 40</div></div></div></div></div></div><div class = 'S8'><span>The API doc is </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#abb16b52adc84eadc2835ae0542f75b90"><span>here</span></a><span>.</span></div><div class = 'S0'><span>What's interesting here is the fact that Faust.normalize returns a Faust object. Combined with slicing (that you will see soon), normalize is useful to write algorithms such as Orthonormal Matching Pursuit (OMP), which require matrices with L2-normalized columns, in a way that makes them able to leverage the acceleration offered by the FAµST API.</span></div><div class = 'S0'><span>The normalization coded in C++ is memory optimized (it never builds the dense matrix full(F) to compute the norms of the columns/rows). In the same goal the factors composing the Faust object NF are not duplicated in memory from same factors F, they're used as is with an additional factor giving the appropriate scaling.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>factors(NF, 5)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement scrollableOutput" uid="3173D7A8" data-scroll-top="null" data-scroll-left="null" data-testid="output_53" data-width="926" data-height="580" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div> (1,1) 0.0035 - (3,1) 0.0413 - (4,1) 0.0459 - (6,1) 0.0654 - (2,2) 0.0275 - (3,2) 0.0233 - (4,2) 0.0078 - (5,2) 0.0385 - (8,2) 0.0429 - (1,3) 0.0408 - (2,3) 0.0104 - (5,3) 0.0382 - (6,3) 0.0386 - (8,3) 0.0188 - (6,4) 0.0692 - (7,4) 0.0377 - (8,4) 0.0568 - (1,5) 0.0192 - (4,5) 0.0698 - (6,5) 0.0108 - (7,5) 0.0730 - (1,6) 0.0179 - (2,6) 0.0097 - (3,6) 0.0256 - (4,6) 0.0193 - (5,6) 0.0215 - (7,6) 0.0255 - (8,6) 0.0209 - (5,7) 0.1890 - (1,8) 0.1062 - (2,9) 0.0240 - (3,9) 0.0328 - (4,9) 0.0376 - (5,9) 0.0353 - (6,9) 0.0199 - (7,9) 0.0063 - (2,10) 0.0089 - (3,10) 0.0487 - (7,10) 0.0482 - (8,10) 0.0272 -</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>cumerr = 0;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>fullF = full(F);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">for </span><span>i=1:size(F,2)</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> normalized_col = fullF(:,i)/norm(fullF(:,i));</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> cumerr = cumerr + norm(NF(:,i) - normalized_col, </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">end</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>cumerr</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>cumerr = 1.5405e-15</div></div></div></div><div class = 'S8'><span>And as you see it works!</span></div><div class = 'S0'><span></span></div><h4 class = 'S12'><span>2.6 Faust Concatenation</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>You're probably aware of Matlab arrays concatenation otherwise look this example.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>M = rand(5,5);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>I = eye(5,5);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>[ M; I ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="090D4585" data-scroll-top="null" data-scroll-left="null" data-testid="output_55" data-width="926" style="width: 956px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 926px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">10×5</span></div><div class="valueContainer" data-layout="{"columnWidth":73,"totalColumns":5,"totalRows":10,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 367px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 0.4646 0.2921 0.8408 0.8864 0.8112 - 0.9722 0.1937 0.0800 0.1349 0.7004 - 0.9748 0.2559 0.1754 0.6393 0.7324 - 0.3829 0.6570 0.0191 0.6451 0.6932 - 0.6989 0.7678 0.1076 0.1505 0.2574 +- FACTOR 4 (real) SPARSE, size 10x10, density 0.5, nnz 50</div></div></div></div></div></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S13'></div></div></div><h4 class = 'S12' id = 'H_BD8A7C70' ><span>2.3 Faust Multiplication by a Vector or a Matrix</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>When you multiply a Faust by a vector or a matrix (the number of nrows must match the number of Faust columns), you'll get respectively a vector or a matrix as result.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>vec = rand(size(F, 2), 1);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>F*vec</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="E32A5952" data-testid="output_28" data-width="1172" style="width: 1202px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 1172px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">10×1</span></div><div class="valueContainer" data-layout="{"columnWidth":66,"totalColumns":1,"totalRows":10,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 68px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 41.0501 + 49.2117 + 45.6702 + 55.8418 + 30.6538 + 39.0950 + 44.5995 + 52.0164 + 39.0722 + 25.9827 +</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div></div><div class = 'S8'><span>Let's launch a timer to compare the execution times of Faust-vector multiplication and Faust's dense matrix-vector multiplication.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F_times_vec = @() F*vec</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="DB9DDB2D" data-testid="output_29" data-width="1172" data-height="34" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">F_times_vec = <span class="headerElement">function_handle with value:</span></span></div><div> @()F*vec +</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'><span style="white-space: pre;"><span>FD = full(F);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>FD_times_vec = @() FD*vec</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="6F9B4A04" data-testid="output_30" data-width="1172" data-height="34" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">FD_times_vec = <span class="headerElement">function_handle with value:</span></span></div><div> @()FD*vec +</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(F_times_vec)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 3.5931e-05</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(FD_times_vec)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsWarningElement" uid="440D990A" data-testid="output_32" data-width="1172" data-height="18" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="diagnosticMessage-wrapper diagnosticMessage-warningType"><div class="diagnosticMessage-messagePart">Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.</div><div class="diagnosticMessage-stackPart"></div></div></div><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 7.1565e-07</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>all(all(F*vec-FD*vec < 1e-7))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="6E3CDBC9" data-testid="output_34" data-width="1172" data-height="34" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 +</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>rcg(F)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.4000</div></div></div></div><div class = 'S8'><span>When the RCG is lower than 1 the Faust-vector multiplication is slower. Making a random Faust with a large RCG (small density) shows better results.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>G = matfaust.rand(1024, 1024, </span><span style="color: rgb(160, 32, 240);">'num_factors'</span><span>, 3, </span><span style="color: rgb(160, 32, 240);">'density'</span><span>, .001, </span><span style="color: rgb(160, 32, 240);">'fac_type'</span><span>, </span><span style="color: rgb(160, 32, 240);">'sparse'</span><span>)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="BD7CF9EC" data-testid="output_36" data-width="1172" data-height="76" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">G = </span></div><div>Faust size 1024x1024, density 0.00292969, nnz_sum 3072, 3 factor(s): +- FACTOR 0 (real) SPARSE, size 1024x1024, density 0.000976563, nnz 1024 +- FACTOR 1 (real) SPARSE, size 1024x1024, density 0.000976563, nnz 1024 +- FACTOR 2 (real) SPARSE, size 1024x1024, density 0.000976563, nnz 1024</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'><span style="white-space: pre;"><span>GD = full(G);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>vec2 = rand(1024, 1);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>timeit(@() G*vec2)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 6.9531e-05</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() GD*vec2)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.0016</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>rcg(G)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 341.3333</div></div></div></div><div class = 'S8'><span>It goes without saying that a big RCG gives a big speedup to the Faust-vector multiplication relatively to the corresponding (dense) matrix-vector multiplication. I hope the example above has finished to convince you.</span></div><div class = 'S0'><span>Just to convince you as well of the Faust-vector multiplication accuracy:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>norm(G*vec2 - GD*vec2)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 4.5356e-16</div></div></div></div><div class = 'S8'><span>What applies to Faust-vector multiplication remains valid about Faust-matrix multiplication. Take a look:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>M = rand(1024,32);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>timeit(@() G*M)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.0038</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() GD*M)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.0129</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(GD*M-G*M)/norm(GD*M)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 6.6552e-17</div></div></div></div><div class = 'S8'><span>Well, what do we see? A quicker Faust-matrix multiplication than the matrix-matrix corresponding multiplication, though a good accuracy of the Faust-matrix multiplication is also clearly confirmed.</span></div><div class = 'S0'><span>These examples are somehow theoretical because we cherry-pick the Faust to ensure that the RCG is good to accelerate the muplication, but at least it shows the potential speedup using Faust objects.</span></div><div class = 'S0'><span></span></div><h4 class = 'S12' id = 'H_7AF16EFF' ><span>2.4 Faust Norms</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>The Faust class provides a norm function which handles different types of norms. This function is really close to Matlab </span><a href = "https://www.mathworks.com/help/matlab/ref/norm.htm"><span>norm</span></a><span> function.</span></div><div class = 'S0'><span>In the following example, three of the four norms available are computed.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>norm(F,1)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 193.4601</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(F, inf)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 146.0016</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(F, </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 123.8180</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(F), 1)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 193.4601</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(F), inf)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 146.0016</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>norm(full(F), </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 123.8180</div></div></div></div><div class = 'S8'><span>Perfect! But a last norm is available, this is the Faust's 2-norm. Let's see in the next small benchmark how the Faust 2-norm is being computed faster than the Faust's dense matrix 2-norm.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>timeit(@() norm(G, 2))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.0021</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() norm(GD, 2))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 1.5850</div></div></div></div><div class = 'S8'><span>The power-iteration algorithm implemented in the FAµ?ST C++ core is faster on G and the relative error is not bad too. The norm computation is faster as it benefits from faster Faust-vector multiplication.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>err = abs((norm(G, 2)-norm(GD,2))/norm(GD,2))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>err = 0.0034</div></div></div></div><div class = 'S8'><span></span></div><h4 class = 'S12' id = 'H_1070C649' ><span>2.5 Faust Normalizations</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>The FAµST API proposes a group of normalizations. They correspond to the norms available and discussed above.</span></div><div class = 'S0'><span>It's possible to normalize along columns or rows with any type of these norms.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F = matfaust.rand(5, 10)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="941A9DF5" data-testid="output_53" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">F = </span></div><div>Faust size 5x10, density 3.1, nnz_sum 155, 5 factor(s): +- FACTOR 0 (real) SPARSE, size 5x6, density 0.666667, nnz 20 +- FACTOR 1 (real) SPARSE, size 6x5, density 1, nnz 30 +- FACTOR 2 (real) SPARSE, size 5x9, density 0.555556, nnz 25 +- FACTOR 3 (real) SPARSE, size 9x7, density 0.714286, nnz 45 +- FACTOR 4 (real) SPARSE, size 7x10, density 0.5, nnz 35</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>NF = normalize(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="BA562C8A" data-testid="output_54" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">NF = </span></div><div>Faust size 5x10, density 3.1, nnz_sum 155, 5 factor(s): +- FACTOR 0 (real) SPARSE, size 5x6, density 0.666667, nnz 20 +- FACTOR 1 (real) SPARSE, size 6x5, density 1, nnz 30 +- FACTOR 2 (real) SPARSE, size 5x9, density 0.555556, nnz 25 +- FACTOR 3 (real) SPARSE, size 9x7, density 0.714286, nnz 45 +- FACTOR 4 (real) SPARSE, size 7x10, density 0.5, nnz 35</div></div></div></div></div></div><div class = 'S8'><span>The API doc is </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/classmatfaust_1_1Faust.html#abb16b52adc84eadc2835ae0542f75b90"><span>here</span></a><span>.</span></div><div class = 'S0'><span>What's interesting here is the fact that Faust.normalize returns a Faust object. Combined with slicing (that you will see soon), normalize is useful to write algorithms such as Orthonormal Matching Pursuit (OMP), which require matrices with L2-normalized columns, in a way that makes them able to leverage the acceleration offered by the FAµST API.</span></div><div class = 'S0'><span>The normalization coded in C++ is memory optimized (it never builds the dense matrix full(F) to compute the norms of the columns/rows). In the same goal the factors composing the Faust object NF are not duplicated in memory from same factors F, they're used as is with an additional factor giving the appropriate scaling.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>factors(NF, 5)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement scrollableOutput" uid="25AC5892" data-testid="output_55" data-width="1172" data-height="510" data-hashorizontaloverflow="false" data-scroll-top="174" data-scroll-left="0" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div> (2,1) 0.0110 + (4,1) 0.0137 + (5,1) 0.0326 + (7,1) 0.0454 + (1,2) 0.0144 + (2,2) 0.0126 + (3,2) 0.0399 + (5,2) 0.0317 + (6,2) 0.0429 + (1,3) 0.0278 + (2,3) 0.0037 + (4,3) 0.1015 + (3,4) 0.0710 + (5,4) 0.0461 + (3,5) 0.0745 + (5,5) 0.0229 + (6,5) 0.0371 + (4,6) 0.1228 + (2,7) 0.0190 + (3,7) 0.0317 + (6,7) 0.0302 + (7,7) 0.0329 + (1,8) 0.0869 + (7,8) 0.0543 + (1,9) 0.0014 + (2,9) 0.0292 + (3,9) 0.0036 + (4,9) 0.0237 + (5,9) 0.0252 + (6,9) 0.0051 + (7,9) 0.0179 + (1,10) 0.0555 + (4,10) 0.0715 + (6,10) 0.0124 + (7,10) 0.0101 +</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>cumerr = 0;</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>fullF = full(F);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">for </span><span>i=1:size(F,2)</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> normalized_col = fullF(:,i)/norm(fullF(:,i));</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span> cumerr = cumerr + norm(NF(:,i) - normalized_col, </span><span style="color: rgb(160, 32, 240);">'fro'</span><span>);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(0, 0, 255);">end</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>cumerr</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>cumerr = 1.8195e-15</div></div></div></div><div class = 'S8'><span>And as you see it works!</span></div><div class = 'S0'><span></span></div><h4 class = 'S12' id = 'H_B081D439' ><span>2.6 Faust Concatenation</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>You're probably aware of Matlab arrays concatenation otherwise look this example.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>M = rand(5,5);</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>I = eye(5,5);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>[ M; I ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="6461B301" data-testid="output_57" data-width="1172" style="width: 1202px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 1172px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">10×5</span></div><div class="valueContainer" data-layout="{"columnWidth":66,"totalColumns":5,"totalRows":10,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 332px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 0.9498 0.2879 0.9385 0.8808 0.2407 + 0.2554 0.0749 0.4457 0.8527 0.8250 + 0.6174 0.3690 0.7012 0.6056 0.8516 + 0.9982 0.1396 0.2804 0.0755 0.2322 + 0.5436 0.1280 0.8271 0.0053 0.5111 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 0 0 0 0 0 1.0000 -</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(34, 139, 34);">% it was vertical concatenation, now let's concatenate horizontally</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>[ M I ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="977EBA77" data-scroll-top="null" data-scroll-left="null" data-testid="output_56" data-width="926" style="width: 956px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 926px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">5×10</span></div><div class="valueContainer" data-layout="{"columnWidth":73,"totalColumns":10,"totalRows":5,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 732px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 0.4646 0.2921 0.8408 0.8864 0.8112 1.0000 0 0 0 0 - 0.9722 0.1937 0.0800 0.1349 0.7004 0 1.0000 0 0 0 - 0.9748 0.2559 0.1754 0.6393 0.7324 0 0 1.0000 0 0 - 0.3829 0.6570 0.0191 0.6451 0.6932 0 0 0 1.0000 0 - 0.6989 0.7678 0.1076 0.1505 0.2574 0 0 0 0 1.0000 -</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div></div><div class = 'S8'><span>I'm sure you guessed that likewise you can concatenate Faust objects. That's right!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>[ F ; F]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="F4BC5FB0" data-scroll-top="null" data-scroll-left="null" data-testid="output_57" data-width="926" data-height="118" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 4.2, nnz_sum 420, 6 factor(s): -- FACTOR 0 (real) SPARSE, size 10x16, density 0.3125, nnz 50 -- FACTOR 1 (real) SPARSE, size 16x18, density 0.277778, nnz 80 -- FACTOR 2 (real) SPARSE, size 18x20, density 0.25, nnz 90 -- FACTOR 3 (real) SPARSE, size 20x16, density 0.3125, nnz 100 -- FACTOR 4 (real) SPARSE, size 16x20, density 0.25, nnz 80 -- FACTOR 5 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>C = [ F F ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="1E92197F" data-scroll-top="null" data-scroll-left="null" data-testid="output_58" data-width="926" data-height="118" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">C = </span></div><div>Faust size 5x20, density 4.1, nnz_sum 410, 6 factor(s): +</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span style="color: rgb(34, 139, 34);">% it was vertical concatenation, now let's concatenate horizontally</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>[ M I ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="040B15C1" data-testid="output_58" data-width="1172" style="width: 1202px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 1172px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">5×10</span></div><div class="valueContainer" data-layout="{"columnWidth":66,"totalColumns":10,"totalRows":5,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 662px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 0.9498 0.2879 0.9385 0.8808 0.2407 1.0000 0 0 0 0 + 0.2554 0.0749 0.4457 0.8527 0.8250 0 1.0000 0 0 0 + 0.6174 0.3690 0.7012 0.6056 0.8516 0 0 1.0000 0 0 + 0.9982 0.1396 0.2804 0.0755 0.2322 0 0 0 1.0000 0 + 0.5436 0.1280 0.8271 0.0053 0.5111 0 0 0 0 1.0000 +</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div></div><div class = 'S8'><span>I'm sure you guessed that likewise you can concatenate Faust objects. That's right!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>[ F ; F]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="16C5D37B" data-testid="output_59" data-width="1172" data-height="118" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 10x10, density 3.3, nnz_sum 330, 6 factor(s): +- FACTOR 0 (real) SPARSE, size 10x12, density 0.333333, nnz 40 +- FACTOR 1 (real) SPARSE, size 12x10, density 0.5, nnz 60 +- FACTOR 2 (real) SPARSE, size 10x18, density 0.277778, nnz 50 +- FACTOR 3 (real) SPARSE, size 18x14, density 0.357143, nnz 90 +- FACTOR 4 (real) SPARSE, size 14x20, density 0.25, nnz 70 +- FACTOR 5 (real) SPARSE, size 20x10, density 0.1, nnz 20</div></div></div></div></div><div class="inlineWrapper"><div class = 'S14'></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>C = [ F F ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="538113B0" data-testid="output_60" data-width="1172" data-height="118" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">C = </span></div><div>Faust size 5x20, density 3.2, nnz_sum 320, 6 factor(s): - FACTOR 0 (real) SPARSE, size 5x10, density 0.2, nnz 10 -- FACTOR 1 (real) SPARSE, size 10x16, density 0.3125, nnz 50 -- FACTOR 2 (real) SPARSE, size 16x18, density 0.277778, nnz 80 -- FACTOR 3 (real) SPARSE, size 18x20, density 0.25, nnz 90 -- FACTOR 4 (real) SPARSE, size 20x16, density 0.3125, nnz 100 -- FACTOR 5 (real) SPARSE, size 16x20, density 0.25, nnz 80</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>full(C) - [ full(F) full(F) ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="FA1B206B" data-scroll-top="null" data-scroll-left="null" data-testid="output_59" data-width="926" style="width: 956px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 926px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">5×20</span></div><div class="valueContainer" data-layout="{"columnWidth":44,"totalColumns":20,"totalRows":5,"charsPerColumn":6}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 882px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +- FACTOR 1 (real) SPARSE, size 10x12, density 0.333333, nnz 40 +- FACTOR 2 (real) SPARSE, size 12x10, density 0.5, nnz 60 +- FACTOR 3 (real) SPARSE, size 10x18, density 0.277778, nnz 50 +- FACTOR 4 (real) SPARSE, size 18x14, density 0.357143, nnz 90 +- FACTOR 5 (real) SPARSE, size 14x20, density 0.25, nnz 70</div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>full(C) - [ full(F) full(F) ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="53EA1128" data-testid="output_61" data-width="1172" style="width: 1202px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 1172px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">ans = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">5×20</span></div><div class="valueContainer" data-layout="{"columnWidth":40,"totalColumns":20,"totalRows":5,"charsPerColumn":6}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 802px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div></div><div class = 'S8'><span>The difference of the two concatenations is full of zeros, so of course it works!</span></div><div class = 'S0'><span>As you noticed the Faust concatenation is stable, you give two Fausts and you get a Faust again. Besides, it's possible to concatenate an arbitrary number of Faust objects.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>[F C C F ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="655726DA" data-scroll-top="null" data-scroll-left="null" data-testid="output_60" data-width="926" data-height="160" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 5x60, density 4.25, nnz_sum 1275, 9 factor(s): +</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div></div><div class = 'S8'><span>The difference of the two concatenations is full of zeros, so of course it works!</span></div><div class = 'S0'><span>As you noticed the Faust concatenation is stable, you give two Fausts and you get a Faust again. Besides, it's possible to concatenate an arbitrary number of Faust objects.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>[F C C F ]</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="D534238F" data-testid="output_62" data-width="1172" data-height="160" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 5x60, density 3.35, nnz_sum 1005, 9 factor(s): - FACTOR 0 (real) SPARSE, size 5x10, density 0.2, nnz 10 - FACTOR 1 (real) SPARSE, size 10x15, density 0.1, nnz 15 - FACTOR 2 (real) SPARSE, size 15x20, density 0.0666667, nnz 20 - FACTOR 3 (real) SPARSE, size 20x30, density 0.05, nnz 30 -- FACTOR 4 (real) SPARSE, size 30x48, density 0.104167, nnz 150 -- FACTOR 5 (real) SPARSE, size 48x54, density 0.0925926, nnz 240 -- FACTOR 6 (real) SPARSE, size 54x60, density 0.0833333, nnz 270 -- FACTOR 7 (real) SPARSE, size 60x48, density 0.104167, nnz 300 -- FACTOR 8 (real) SPARSE, size 48x60, density 0.0833333, nnz 240</div></div></div></div></div></div><div class = 'S8'><span>As an exercise, you can write the factors of the Faust</span><span style=' font-family: monospace;'> [F ; F]</span><span>, F being any Faust.</span></div><div class = 'S0'><span style=' font-weight: bold;'>Hint</span><span>: the block-diagonal matrices are around here.</span></div><div class = 'S0'><span></span></div><h4 class = 'S12'><span>2.7 Faust Indexing and Slicing</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>Sometimes you need to access the dense matrix corresponding to a Faust or an element of it (by the way, note that it's costly).</span></div><div class = 'S0'><span>Let's access a Faust item:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F(3, 4)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 4.4882</div></div></div></div><div class = 'S8'><span>Why is it costly? Because it essentially converts the Faust to its dense form (modulo some optimizations) to just access one item.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>timeit(@() F(3, 4))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 4.8594e-04</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() FD(3, 4))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsWarningElement" uid="FF24A602" data-scroll-top="null" data-scroll-left="null" data-testid="output_63" data-width="926" data-height="18" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="diagnosticMessage-wrapper diagnosticMessage-warningType"><div class="diagnosticMessage-messagePart">Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.</div><div class="diagnosticMessage-stackPart"></div></div></div><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 3.5386e-07</div></div></div></div><div class = 'S8'><span>It's totally the same syntax as Matlab but much slower so use it with care.</span></div><div class = 'S0'><span>The more advanced slicing operation uses also the same syntax as Matlab:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F(3:5, 4:10)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="BCB69AEF" data-scroll-top="null" data-scroll-left="null" data-testid="output_65" data-width="926" data-height="104" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 3x7, density 8.38095, nnz_sum 176, 5 factor(s): -- FACTOR 0 (real) SPARSE, size 3x8, density 0.625, nnz 15 -- FACTOR 1 (real) SPARSE, size 8x9, density 0.555556, nnz 40 -- FACTOR 2 (real) SPARSE, size 9x10, density 0.5, nnz 45 -- FACTOR 3 (real) SPARSE, size 10x8, density 0.625, nnz 50 -- FACTOR 4 (real) SPARSE, size 8x7, density 0.464286, nnz 26</div></div></div></div></div></div><div class = 'S8'><span>Here again, the result is another Faust. But this is not a full copy, it makes profit of memory views implemented behind in C++. Solely the first and last factors of the sliced Faust are new in memory, the others are just referenced from the initial Faust F. So use it with no worry for a Faust with a lot of factors!</span></div><div class = 'S0'><span>The Matlab indexing by arbitrary vector of integers has also been implemented in the FAµ?ST C++ core, let's try it:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>I = [2, 4, 3];</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>FI = F(I,:);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>matfaust.isFaust(FI)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="100B3F16" data-scroll-top="null" data-scroll-left="null" data-testid="output_66" data-width="926" data-height="34" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 -</div></div></div></div></div></div><div class = 'S8'><span>Again, it's a Faust but is it really working? Verify!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>FID = full(FI)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="A6572BAA" data-scroll-top="null" data-scroll-left="null" data-testid="output_67" data-width="926" style="width: 956px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 926px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">FID = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">3×10</span></div><div class="valueContainer" data-layout="{"columnWidth":73,"totalColumns":10,"totalRows":3,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 732px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 8.9957 11.7083 14.8396 6.6188 7.8696 23.0172 2.3615 1.9188 10.7625 10.2643 - 4.8183 7.0419 9.1435 3.7627 4.6130 13.9024 1.5176 1.3094 6.0943 5.9542 - 6.0062 8.0569 10.5489 4.4882 5.6134 15.9861 1.8449 1.3966 7.3818 6.8053 -</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>FD = full(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="3DAF38DC" data-scroll-top="null" data-scroll-left="null" data-testid="output_68" data-width="926" style="width: 956px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 926px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">FD = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">5×10</span></div><div class="valueContainer" data-layout="{"columnWidth":73,"totalColumns":10,"totalRows":5,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 732px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 6.1737 8.5499 11.1382 4.7044 5.6684 17.0015 1.7882 1.5646 7.5773 7.4382 - 8.9957 11.7083 14.8396 6.6188 7.8696 23.0172 2.3615 1.9188 10.7625 10.2643 - 6.0062 8.0569 10.5489 4.4882 5.6134 15.9861 1.8449 1.3966 7.3818 6.8053 - 4.8183 7.0419 9.1435 3.7627 4.6130 13.9024 1.5176 1.3094 6.0943 5.9542 - 4.8377 6.0456 7.7101 3.4253 4.2102 11.7624 1.3160 0.9319 5.7729 5.0566 -</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>all(all(FID(1, :) == FD(I(1), :) & FID(2, :) == FD(I(2), :) & FID(3, :) == FD(I(3), :)))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="3E59CE19" data-scroll-top="null" data-scroll-left="null" data-testid="output_69" data-width="926" data-height="34" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 -</div></div></div></div></div></div><div class = 'S8'><span>Yes it is!</span></div><div class = 'S0'><span></span></div><div class = 'S0'><span>This is the notebook's end, you have now a global view of what the Faust class is able and what kind of high-level algorithms it is ready for. You might be interested to read other notebooks, just go back to the </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/index.html"><span>page</span></a><span> where you got this one.</span></div><div class = 'S0'><span style=' font-weight: bold;'>Note:</span><span> this livescript was executed using the following matfaust version:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>matfaust.version()</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="B059AC81" data-testid="output_70" data-width="926" data-height="20" data-hashorizontaloverflow="false" style="width: 956px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span>'2.10.17'</div></div></div></div></div><div class="inlineWrapper"><div class = 'S15'></div></div></div><div class = 'S8'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'></div></div><br> +- FACTOR 4 (real) SPARSE, size 30x36, density 0.111111, nnz 120 +- FACTOR 5 (real) SPARSE, size 36x30, density 0.166667, nnz 180 +- FACTOR 6 (real) SPARSE, size 30x54, density 0.0925926, nnz 150 +- FACTOR 7 (real) SPARSE, size 54x42, density 0.119048, nnz 270 +- FACTOR 8 (real) SPARSE, size 42x60, density 0.0833333, nnz 210</div></div></div></div></div></div><div class = 'S8'><span>As an exercise, you can write the factors of the Faust</span><span style=' font-family: monospace;'> [F ; F]</span><span>, F being any Faust.</span></div><div class = 'S0'><span style=' font-weight: bold;'>Hint</span><span>: the block-diagonal matrices are around here.</span></div><div class = 'S0'><span></span></div><h4 class = 'S12' id = 'H_EBCC81E9' ><span>2.7 Faust Indexing and Slicing</span></h4><div class = 'S0'><span></span></div><div class = 'S0'><span>Sometimes you need to access the dense matrix corresponding to a Faust or an element of it (by the way, note that it's costly).</span></div><div class = 'S0'><span>Let's access a Faust item:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F(3, 4)</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 4.5517</div></div></div></div><div class = 'S8'><span>Why is it costly? Because it essentially converts the Faust to its dense form (modulo some optimizations) to just access one item.</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>timeit(@() F(3, 4))</span></span></div><div class = 'S6'><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0.0011</div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>timeit(@() FD(3, 4))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsWarningElement" uid="6D482C81" data-testid="output_65" data-width="1172" data-height="18" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="diagnosticMessage-wrapper diagnosticMessage-warningType"><div class="diagnosticMessage-messagePart">Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.</div><div class="diagnosticMessage-stackPart"></div></div></div><div class='variableElement' style='font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12px; '>ans = 0</div></div></div></div><div class = 'S8'><span>It's totally the same syntax as Matlab but much slower so use it with care.</span></div><div class = 'S0'><span>The more advanced slicing operation uses also the same syntax as Matlab:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>F(3:5, 4:10)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="FB448FDC" data-testid="output_67" data-width="1172" data-height="104" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span></div><div>Faust size 3x7, density 6.42857, nnz_sum 135, 5 factor(s): +- FACTOR 0 (real) SPARSE, size 3x6, density 0.666667, nnz 12 +- FACTOR 1 (real) SPARSE, size 6x5, density 1, nnz 30 +- FACTOR 2 (real) SPARSE, size 5x9, density 0.555556, nnz 25 +- FACTOR 3 (real) SPARSE, size 9x7, density 0.714286, nnz 45 +- FACTOR 4 (real) SPARSE, size 7x7, density 0.469388, nnz 23</div></div></div></div></div></div><div class = 'S8'><span>Here again, the result is another Faust. But this is not a full copy, it makes profit of memory views implemented behind in C++. Solely the first and last factors of the sliced Faust are new in memory, the others are just referenced from the initial Faust F. So use it with no worry for a Faust with a lot of factors!</span></div><div class = 'S0'><span>The Matlab indexing by arbitrary vector of integers has also been implemented in the FAµ?ST C++ core, let's try it:</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S9'><span style="white-space: pre;"><span>I = [2, 4, 3];</span></span></div></div><div class="inlineWrapper"><div class = 'S11'><span style="white-space: pre;"><span>FI = F(I,:);</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S10'><span style="white-space: pre;"><span>matfaust.isFaust(FI)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="D9515D09" data-testid="output_68" data-width="1172" data-height="34" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 1 +</div></div></div></div></div></div><div class = 'S8'><span>Again, it's a Faust but is it really working? Verify!</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>FID = full(FI)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="4D785859" data-testid="output_69" data-width="1172" style="width: 1202px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 1172px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">FID = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">3×10</span></div><div class="valueContainer" data-layout="{"columnWidth":66,"totalColumns":10,"totalRows":3,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 662px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 8.6416 8.6416 8.8458 8.6416 4.2308 8.6416 6.3638 8.6416 5.6379 8.6416 + 6.0348 6.0348 6.6685 6.0348 2.9693 6.0348 4.9064 6.0348 4.3525 6.0348 + 7.2944 7.2944 7.5158 7.2944 3.6321 7.2944 5.4321 7.2944 4.8335 7.2944 +</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>FD = full(F)</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableMatrixElement" uid="AF83E6B1" data-testid="output_70" data-width="1172" style="width: 1202px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="matrixElement veSpecifier" style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="veVariableName variableNameElement double" style="width: 1172px; white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><span style="white-space: normal; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;">FD = </span><span class="veVariableValueSummary veMetaSummary" style="white-space: normal; font-style: normal; color: rgb(179, 179, 179); font-size: 12px;">5×10</span></div><div class="valueContainer" data-layout="{"columnWidth":66,"totalColumns":10,"totalRows":5,"charsPerColumn":10}" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"><div class="variableValue" style="width: 662px; white-space: pre; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"> 6.0348 6.6685 2.9693 4.9064 4.3525 2.5213 7.5575 1.7875 10.7148 3.5887 + 8.6416 8.8458 4.2308 6.3638 5.6379 3.6127 10.5910 2.5712 15.2344 5.0702 + 6.6132 6.4056 3.3165 4.5517 4.0479 2.8073 8.1196 2.0966 11.5987 3.9959 + 7.2944 7.5158 3.6321 5.4321 4.8335 3.0580 9.0816 2.2985 12.8331 4.4162 + 11.1903 11.6055 5.7530 8.4704 7.5258 4.9098 13.9732 3.4261 19.9193 6.8549 +</div><div class="horizontalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div><div class="verticalEllipsis hide" style="white-space: nowrap; font-style: normal; color: rgb(64, 64, 64); font-size: 12px;"></div></div></div></div></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre;"><span>all(all(FID(1, :) == FD(I(1), :) & FID(2, :) == FD(I(2), :) & FID(3, :) == FD(I(3), :)))</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="ACAA515F" data-testid="output_71" data-width="1172" data-height="34" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = <span class="headerElement">logical</span></span></div><div> 0 +</div></div></div></div></div></div><div class = 'S8'><span>Yes it is!</span></div><div class = 'S0'><span></span></div><div class = 'S0'><span>This is the notebook's end, you have now a global view of what the Faust class is able and what kind of high-level algorithms it is ready for. You might be interested to read other notebooks, just go back to the </span><a href = "https://faustgrp.gitlabpages.inria.fr/faust/last-doc/html/index.html"><span>page</span></a><span> where you got this one.</span></div><div class = 'S0'><span style=' font-weight: bold;'>Note:</span><span> this livescript was executed using the following matfaust version:</span></div><div class="CodeBlock"><div class="inlineWrapper outputs"><div class = 'S5'><span style="white-space: pre;"><span>matfaust.version()</span></span></div><div class = 'S6'><div class="inlineElement eoOutputWrapper embeddedOutputsVariableStringElement" uid="A7CDA7FB" data-testid="output_72" data-width="1172" data-height="20" data-hashorizontaloverflow="false" style="width: 1202px; max-height: 261px;"><div class="textElement"><div><span class="variableNameElement">ans = </span>'2.10.29'</div></div></div></div></div></div><div class = 'S8'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'><span></span></div><div class = 'S0'></div></div><br> <!-- ##### SOURCE BEGIN ##### %% @@ -325,31 +329,33 @@ %% Table of Contents: % % -% 1. Getting Basic Information about a Faust Object +% <internal:H_E9BF5BFF 1. Getting Basic Information about a Faust Object> +% +% <internal:H_95BE1343 1.1 Obtaining Dimension and Scalar Type Information> +% +% <internal:H_0602CE09 1.2 Obtaining Other Faust Specific Information> % -% 1.1 Obtaining Dimension and Scalar Type Information +% <internal:H_2CF60B15 1.3 Plotting a Faust> % -% 1.2 Obtaining Other Faust Specific Information +% <internal:H_C5C21250 1.4 About Sparsity!> % -% 1.3 Plotting a Faust % -% 1.4 About Sparsity! % -% 2. Faust Algebra and other Operations +% <internal:H_73387A87 2. Faust Algebra and other Operations> % -% 2.1 Transpose, conjugate, transconjugate +% <internal:H_5E556DD4 2.1 Transpose, conjugate, transconjugate> % -% 2.2 Add, Subtract and Multiply +% <internal:H_99DA98B4 2.2 Add, Subtract and Multiply> % -% 2.3 Faust Multiplication by a Vector or a Matrix +% <internal:H_BD8A7C70 2.3 Faust Multiplication by a Vector or a Matrix> % -% 2.4 Faust Norms +% <internal:H_7AF16EFF 2.4 Faust Norms> % -% 2.5 Faust Normalizations +% <internal:H_1070C649 2.5 Faust Normalizations> % -% 2.6 Faust Concatenation +% <internal:H_B081D439 2.6 Faust Concatenation> % -% 2.7 Faust Indexing and Slicing +% <internal:H_EBCC81E9 2.7 Faust Indexing and Slicing> % % %% 1. Getting Basic Information about a Faust Object @@ -450,8 +456,21 @@ Faust({factors(F, 3), factors(F, 4)}) %% 1.3 Plotting a Faust % % -% Available soon! +% It's quite useful to print a |Faust| as we've seen before, calling disp(F), +% |display(F)| or just |F| in an interactive terminal but this is wordy. How +% about plotting a Faust in a more graphical fashion ? + +imagesc(F) +%% +% What do we see above ? On the bottom right is the dense matrix associated +% to F, obtained with |full(F)|. On the top are the indexed factors of F. Note +% that you can change the default <https://www.mathworks.com/help/matlab/ref/colormap.html +% colormap> in matplotlib parameters. % +% Let's look at a last example: + +imagesc(Faust({eye(5,4),eye(4,10)})) +%% % %% 1.4 About Sparsity! % @@ -481,6 +500,7 @@ rcg(F) % According to its RCG, this Faust doesn't seem to be of any help for optimization % but look at the graphic the next script generates: +figure() nfactors = 3; startd = 0.01; endd = 1; @@ -812,7 +832,6 @@ all(all(FID(1, :) == FD(I(1), :) & FID(2, :) == FD(I(2), :) & FID(3, :) == FD(I( % *Note:* this livescript was executed using the following matfaust version: matfaust.version() - %% % % @@ -824,8 +843,6 @@ matfaust.version() % % % -% -% % ##### SOURCE END ##### --></body></html> \ No newline at end of file -- GitLab