Skipping indices in a product












2












$begingroup$


I have a matrix $A$ for which I want to compute the quantity $Tlambda_j = Pi_{lambda_ine lambda_j} frac{A - lambda_i I}{lambda_j-lambda_i}$, where $lambda_i$ ($lambda_j$) denote the eigenvalues of $A$. How can this be implemented in Mathematica? Just gave a try here:



A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
Eigenvalues[A]



{2, -1, 1, 1}




Tj = Product[(A - Eigenvalues[A][[i]] IdentityMatrix[4])/(
Eigenvalues[A][[j]] - Eigenvalues[A][[i]]), {i, 1, 4}]









share|improve this question











$endgroup$












  • $begingroup$
    in which part exactly you want to exclude it in Tj !??
    $endgroup$
    – Alrubaie
    Mar 29 at 18:02










  • $begingroup$
    do you want it to be skipped put not Zero right !?
    $endgroup$
    – Alrubaie
    Mar 29 at 18:07










  • $begingroup$
    @Alrubaie, there was a typo in my post. Just edited it. I want the denominator to be non-zero and hence avoid the case for which $i=j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:08










  • $begingroup$
    @Alrubaie, my $i$ and $j$ are not the indices in my question. They are the eigenvalues. I should have used something like $lambda_i$ and $lambda_j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:12






  • 2




    $begingroup$
    That product is presumably a matrix multiplication?
    $endgroup$
    – J. M. is slightly pensive
    Mar 29 at 18:34
















2












$begingroup$


I have a matrix $A$ for which I want to compute the quantity $Tlambda_j = Pi_{lambda_ine lambda_j} frac{A - lambda_i I}{lambda_j-lambda_i}$, where $lambda_i$ ($lambda_j$) denote the eigenvalues of $A$. How can this be implemented in Mathematica? Just gave a try here:



A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
Eigenvalues[A]



{2, -1, 1, 1}




Tj = Product[(A - Eigenvalues[A][[i]] IdentityMatrix[4])/(
Eigenvalues[A][[j]] - Eigenvalues[A][[i]]), {i, 1, 4}]









share|improve this question











$endgroup$












  • $begingroup$
    in which part exactly you want to exclude it in Tj !??
    $endgroup$
    – Alrubaie
    Mar 29 at 18:02










  • $begingroup$
    do you want it to be skipped put not Zero right !?
    $endgroup$
    – Alrubaie
    Mar 29 at 18:07










  • $begingroup$
    @Alrubaie, there was a typo in my post. Just edited it. I want the denominator to be non-zero and hence avoid the case for which $i=j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:08










  • $begingroup$
    @Alrubaie, my $i$ and $j$ are not the indices in my question. They are the eigenvalues. I should have used something like $lambda_i$ and $lambda_j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:12






  • 2




    $begingroup$
    That product is presumably a matrix multiplication?
    $endgroup$
    – J. M. is slightly pensive
    Mar 29 at 18:34














2












2








2





$begingroup$


I have a matrix $A$ for which I want to compute the quantity $Tlambda_j = Pi_{lambda_ine lambda_j} frac{A - lambda_i I}{lambda_j-lambda_i}$, where $lambda_i$ ($lambda_j$) denote the eigenvalues of $A$. How can this be implemented in Mathematica? Just gave a try here:



A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
Eigenvalues[A]



{2, -1, 1, 1}




Tj = Product[(A - Eigenvalues[A][[i]] IdentityMatrix[4])/(
Eigenvalues[A][[j]] - Eigenvalues[A][[i]]), {i, 1, 4}]









share|improve this question











$endgroup$




I have a matrix $A$ for which I want to compute the quantity $Tlambda_j = Pi_{lambda_ine lambda_j} frac{A - lambda_i I}{lambda_j-lambda_i}$, where $lambda_i$ ($lambda_j$) denote the eigenvalues of $A$. How can this be implemented in Mathematica? Just gave a try here:



A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
Eigenvalues[A]



{2, -1, 1, 1}




Tj = Product[(A - Eigenvalues[A][[i]] IdentityMatrix[4])/(
Eigenvalues[A][[j]] - Eigenvalues[A][[i]]), {i, 1, 4}]






matrix linear-algebra operators






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago









Michael E2

150k12203482




150k12203482










asked Mar 29 at 17:54









Tobias FritznTobias Fritzn

1895




1895












  • $begingroup$
    in which part exactly you want to exclude it in Tj !??
    $endgroup$
    – Alrubaie
    Mar 29 at 18:02










  • $begingroup$
    do you want it to be skipped put not Zero right !?
    $endgroup$
    – Alrubaie
    Mar 29 at 18:07










  • $begingroup$
    @Alrubaie, there was a typo in my post. Just edited it. I want the denominator to be non-zero and hence avoid the case for which $i=j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:08










  • $begingroup$
    @Alrubaie, my $i$ and $j$ are not the indices in my question. They are the eigenvalues. I should have used something like $lambda_i$ and $lambda_j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:12






  • 2




    $begingroup$
    That product is presumably a matrix multiplication?
    $endgroup$
    – J. M. is slightly pensive
    Mar 29 at 18:34


















  • $begingroup$
    in which part exactly you want to exclude it in Tj !??
    $endgroup$
    – Alrubaie
    Mar 29 at 18:02










  • $begingroup$
    do you want it to be skipped put not Zero right !?
    $endgroup$
    – Alrubaie
    Mar 29 at 18:07










  • $begingroup$
    @Alrubaie, there was a typo in my post. Just edited it. I want the denominator to be non-zero and hence avoid the case for which $i=j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:08










  • $begingroup$
    @Alrubaie, my $i$ and $j$ are not the indices in my question. They are the eigenvalues. I should have used something like $lambda_i$ and $lambda_j$.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:12






  • 2




    $begingroup$
    That product is presumably a matrix multiplication?
    $endgroup$
    – J. M. is slightly pensive
    Mar 29 at 18:34
















$begingroup$
in which part exactly you want to exclude it in Tj !??
$endgroup$
– Alrubaie
Mar 29 at 18:02




$begingroup$
in which part exactly you want to exclude it in Tj !??
$endgroup$
– Alrubaie
Mar 29 at 18:02












$begingroup$
do you want it to be skipped put not Zero right !?
$endgroup$
– Alrubaie
Mar 29 at 18:07




$begingroup$
do you want it to be skipped put not Zero right !?
$endgroup$
– Alrubaie
Mar 29 at 18:07












$begingroup$
@Alrubaie, there was a typo in my post. Just edited it. I want the denominator to be non-zero and hence avoid the case for which $i=j$.
$endgroup$
– Tobias Fritzn
Mar 29 at 18:08




$begingroup$
@Alrubaie, there was a typo in my post. Just edited it. I want the denominator to be non-zero and hence avoid the case for which $i=j$.
$endgroup$
– Tobias Fritzn
Mar 29 at 18:08












$begingroup$
@Alrubaie, my $i$ and $j$ are not the indices in my question. They are the eigenvalues. I should have used something like $lambda_i$ and $lambda_j$.
$endgroup$
– Tobias Fritzn
Mar 29 at 18:12




$begingroup$
@Alrubaie, my $i$ and $j$ are not the indices in my question. They are the eigenvalues. I should have used something like $lambda_i$ and $lambda_j$.
$endgroup$
– Tobias Fritzn
Mar 29 at 18:12




2




2




$begingroup$
That product is presumably a matrix multiplication?
$endgroup$
– J. M. is slightly pensive
Mar 29 at 18:34




$begingroup$
That product is presumably a matrix multiplication?
$endgroup$
– J. M. is slightly pensive
Mar 29 at 18:34










4 Answers
4






active

oldest

votes


















4












$begingroup$

Here is my pedestrian implementation of your formula:



a = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};

ClearAll[t]
t[amat_, j_] := Module[
{evals, usable},
evals = Eigenvalues[amat];
usable = DeleteDuplicates@Cases[evals, Except@evals[[j]] ];
Dot @@
Table[
(amat - i IdentityMatrix[Length[amat]])/(evals[[j]] - i),
{i, usable}
]
]

t[a, 4]


Mathematica graphics



You do not provide an example of desired output, so I will let you check whether this is what you expect.






share|improve this answer









$endgroup$













  • $begingroup$
    Thanks, @MarcoB. It leads precisely to the expected result. However, it looks too complicated. Nevertheless, it is fine as it works.
    $endgroup$
    – Tobias Fritzn
    Mar 29 at 18:46





















3












$begingroup$

Something like this?



Clear[A, evals, T]
A = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};
T[A_?MatrixQ, j_Integer] := With[
{evals = Eigenvalues[A], id = IdentityMatrix@Length@A},
Dot @@ Table[
If[evals[[j]] - evals[[i]] == 0, id, (A - evals[[i]] id)/(evals[[j]] - evals[[i]])],
{i, Length@A}
]
]

MatrixForm /@ Array[T[A, #] &, 4]


enter image description here






share|improve this answer









$endgroup$





















    2












    $begingroup$

    This



    A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
    e=Eigenvalues[A];
    Map[(A-e[[#[[1]]]]*IdentityMatrix[4])/(e[[#[[2]]]]-e[[#[[1]]]])&,
    DeleteCases[Tuples[Range[4],2],{i_,i_}]]


    generates your twelve matricies with i not equal to j.



    Put Dot@@ in front of that Map to form the dot product of the 12 matricies.



    That works by forming every possible distinct i,j pair and then using those in the Map



    If it might be easier to read you can also write it this way



    Map[(ei=e[[#[[1]]]];ej=e[[#[[2]]]];
    (A-ei*IdentityMatrix[4])/(ej-ei))&,
    DeleteCases[Tuples[Range[4],2],{i_,i_}]]





    share|improve this answer











    $endgroup$













    • $begingroup$
      Should e[[#[[2]]]]-e[[[[1]]]] be e[[#[[2]]]]-e[[#[[1]]]]?
      $endgroup$
      – That Gravity Guy
      Mar 29 at 19:12










    • $begingroup$
      @ThatGravityGuy Yes! Good catch. Thank you! Corrected.
      $endgroup$
      – Bill
      Mar 29 at 19:14



















    0












    $begingroup$

    Another way:



    ClearAll[t];
    t[j_Integer, A_?SquareMatrixQ] := t[j, A, Eigenvalues@A]; (* add the eigenvalues *)
    t[j_Integer, A_?SquareMatrixQ, evs_?VectorQ] /; Length@A == Length@evs := (* arg checks *)=
    Fold[
    #1.(A - #2 IdentityMatrix[Length@A])/(evs[[j]] - #2) &,
    IdentityMatrix[Length@A],
    Pick[evs, Unitize[evs - evs[[j]]], 1] (* Pick nonzero differences *)
    ];


    Performance tuning: One can use DeleteCases[evs, e_ /; e == evs[[j]]] to pick the eigenvalues that give a nonzero difference. It makes no consistent difference to the timing on a 101 x 101 machine real matrix. One can save a little time by computing the identity matrix once and using With to inject it in the two places it occurs. One can also save time using dot = (dot = Dot; #2) & instead of Dot to skip the multiplication by the identity matrix (the first step of Fold). The differences evs - evs[[j]] appear twice, so they can be replaced by a single computation like the identity matrix. It can make up to a 10% improvement.






    share|improve this answer









    $endgroup$














      Your Answer





      StackExchange.ifUsing("editor", function () {
      return StackExchange.using("mathjaxEditing", function () {
      StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
      StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
      });
      });
      }, "mathjax-editing");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "387"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f194194%2fskipping-indices-in-a-product%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      4












      $begingroup$

      Here is my pedestrian implementation of your formula:



      a = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};

      ClearAll[t]
      t[amat_, j_] := Module[
      {evals, usable},
      evals = Eigenvalues[amat];
      usable = DeleteDuplicates@Cases[evals, Except@evals[[j]] ];
      Dot @@
      Table[
      (amat - i IdentityMatrix[Length[amat]])/(evals[[j]] - i),
      {i, usable}
      ]
      ]

      t[a, 4]


      Mathematica graphics



      You do not provide an example of desired output, so I will let you check whether this is what you expect.






      share|improve this answer









      $endgroup$













      • $begingroup$
        Thanks, @MarcoB. It leads precisely to the expected result. However, it looks too complicated. Nevertheless, it is fine as it works.
        $endgroup$
        – Tobias Fritzn
        Mar 29 at 18:46


















      4












      $begingroup$

      Here is my pedestrian implementation of your formula:



      a = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};

      ClearAll[t]
      t[amat_, j_] := Module[
      {evals, usable},
      evals = Eigenvalues[amat];
      usable = DeleteDuplicates@Cases[evals, Except@evals[[j]] ];
      Dot @@
      Table[
      (amat - i IdentityMatrix[Length[amat]])/(evals[[j]] - i),
      {i, usable}
      ]
      ]

      t[a, 4]


      Mathematica graphics



      You do not provide an example of desired output, so I will let you check whether this is what you expect.






      share|improve this answer









      $endgroup$













      • $begingroup$
        Thanks, @MarcoB. It leads precisely to the expected result. However, it looks too complicated. Nevertheless, it is fine as it works.
        $endgroup$
        – Tobias Fritzn
        Mar 29 at 18:46
















      4












      4








      4





      $begingroup$

      Here is my pedestrian implementation of your formula:



      a = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};

      ClearAll[t]
      t[amat_, j_] := Module[
      {evals, usable},
      evals = Eigenvalues[amat];
      usable = DeleteDuplicates@Cases[evals, Except@evals[[j]] ];
      Dot @@
      Table[
      (amat - i IdentityMatrix[Length[amat]])/(evals[[j]] - i),
      {i, usable}
      ]
      ]

      t[a, 4]


      Mathematica graphics



      You do not provide an example of desired output, so I will let you check whether this is what you expect.






      share|improve this answer









      $endgroup$



      Here is my pedestrian implementation of your formula:



      a = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};

      ClearAll[t]
      t[amat_, j_] := Module[
      {evals, usable},
      evals = Eigenvalues[amat];
      usable = DeleteDuplicates@Cases[evals, Except@evals[[j]] ];
      Dot @@
      Table[
      (amat - i IdentityMatrix[Length[amat]])/(evals[[j]] - i),
      {i, usable}
      ]
      ]

      t[a, 4]


      Mathematica graphics



      You do not provide an example of desired output, so I will let you check whether this is what you expect.







      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered Mar 29 at 18:38









      MarcoBMarcoB

      38.4k556115




      38.4k556115












      • $begingroup$
        Thanks, @MarcoB. It leads precisely to the expected result. However, it looks too complicated. Nevertheless, it is fine as it works.
        $endgroup$
        – Tobias Fritzn
        Mar 29 at 18:46




















      • $begingroup$
        Thanks, @MarcoB. It leads precisely to the expected result. However, it looks too complicated. Nevertheless, it is fine as it works.
        $endgroup$
        – Tobias Fritzn
        Mar 29 at 18:46


















      $begingroup$
      Thanks, @MarcoB. It leads precisely to the expected result. However, it looks too complicated. Nevertheless, it is fine as it works.
      $endgroup$
      – Tobias Fritzn
      Mar 29 at 18:46






      $begingroup$
      Thanks, @MarcoB. It leads precisely to the expected result. However, it looks too complicated. Nevertheless, it is fine as it works.
      $endgroup$
      – Tobias Fritzn
      Mar 29 at 18:46













      3












      $begingroup$

      Something like this?



      Clear[A, evals, T]
      A = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};
      T[A_?MatrixQ, j_Integer] := With[
      {evals = Eigenvalues[A], id = IdentityMatrix@Length@A},
      Dot @@ Table[
      If[evals[[j]] - evals[[i]] == 0, id, (A - evals[[i]] id)/(evals[[j]] - evals[[i]])],
      {i, Length@A}
      ]
      ]

      MatrixForm /@ Array[T[A, #] &, 4]


      enter image description here






      share|improve this answer









      $endgroup$


















        3












        $begingroup$

        Something like this?



        Clear[A, evals, T]
        A = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};
        T[A_?MatrixQ, j_Integer] := With[
        {evals = Eigenvalues[A], id = IdentityMatrix@Length@A},
        Dot @@ Table[
        If[evals[[j]] - evals[[i]] == 0, id, (A - evals[[i]] id)/(evals[[j]] - evals[[i]])],
        {i, Length@A}
        ]
        ]

        MatrixForm /@ Array[T[A, #] &, 4]


        enter image description here






        share|improve this answer









        $endgroup$
















          3












          3








          3





          $begingroup$

          Something like this?



          Clear[A, evals, T]
          A = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};
          T[A_?MatrixQ, j_Integer] := With[
          {evals = Eigenvalues[A], id = IdentityMatrix@Length@A},
          Dot @@ Table[
          If[evals[[j]] - evals[[i]] == 0, id, (A - evals[[i]] id)/(evals[[j]] - evals[[i]])],
          {i, Length@A}
          ]
          ]

          MatrixForm /@ Array[T[A, #] &, 4]


          enter image description here






          share|improve this answer









          $endgroup$



          Something like this?



          Clear[A, evals, T]
          A = {{1, 0, 0, 1}, {0, 1, 2, 0}, {1, 1, 0, 2}, {0, 0, 0, 1}};
          T[A_?MatrixQ, j_Integer] := With[
          {evals = Eigenvalues[A], id = IdentityMatrix@Length@A},
          Dot @@ Table[
          If[evals[[j]] - evals[[i]] == 0, id, (A - evals[[i]] id)/(evals[[j]] - evals[[i]])],
          {i, Length@A}
          ]
          ]

          MatrixForm /@ Array[T[A, #] &, 4]


          enter image description here







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Mar 29 at 18:47









          That Gravity GuyThat Gravity Guy

          2,1411615




          2,1411615























              2












              $begingroup$

              This



              A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
              e=Eigenvalues[A];
              Map[(A-e[[#[[1]]]]*IdentityMatrix[4])/(e[[#[[2]]]]-e[[#[[1]]]])&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]


              generates your twelve matricies with i not equal to j.



              Put Dot@@ in front of that Map to form the dot product of the 12 matricies.



              That works by forming every possible distinct i,j pair and then using those in the Map



              If it might be easier to read you can also write it this way



              Map[(ei=e[[#[[1]]]];ej=e[[#[[2]]]];
              (A-ei*IdentityMatrix[4])/(ej-ei))&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]





              share|improve this answer











              $endgroup$













              • $begingroup$
                Should e[[#[[2]]]]-e[[[[1]]]] be e[[#[[2]]]]-e[[#[[1]]]]?
                $endgroup$
                – That Gravity Guy
                Mar 29 at 19:12










              • $begingroup$
                @ThatGravityGuy Yes! Good catch. Thank you! Corrected.
                $endgroup$
                – Bill
                Mar 29 at 19:14
















              2












              $begingroup$

              This



              A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
              e=Eigenvalues[A];
              Map[(A-e[[#[[1]]]]*IdentityMatrix[4])/(e[[#[[2]]]]-e[[#[[1]]]])&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]


              generates your twelve matricies with i not equal to j.



              Put Dot@@ in front of that Map to form the dot product of the 12 matricies.



              That works by forming every possible distinct i,j pair and then using those in the Map



              If it might be easier to read you can also write it this way



              Map[(ei=e[[#[[1]]]];ej=e[[#[[2]]]];
              (A-ei*IdentityMatrix[4])/(ej-ei))&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]





              share|improve this answer











              $endgroup$













              • $begingroup$
                Should e[[#[[2]]]]-e[[[[1]]]] be e[[#[[2]]]]-e[[#[[1]]]]?
                $endgroup$
                – That Gravity Guy
                Mar 29 at 19:12










              • $begingroup$
                @ThatGravityGuy Yes! Good catch. Thank you! Corrected.
                $endgroup$
                – Bill
                Mar 29 at 19:14














              2












              2








              2





              $begingroup$

              This



              A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
              e=Eigenvalues[A];
              Map[(A-e[[#[[1]]]]*IdentityMatrix[4])/(e[[#[[2]]]]-e[[#[[1]]]])&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]


              generates your twelve matricies with i not equal to j.



              Put Dot@@ in front of that Map to form the dot product of the 12 matricies.



              That works by forming every possible distinct i,j pair and then using those in the Map



              If it might be easier to read you can also write it this way



              Map[(ei=e[[#[[1]]]];ej=e[[#[[2]]]];
              (A-ei*IdentityMatrix[4])/(ej-ei))&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]





              share|improve this answer











              $endgroup$



              This



              A = {{1, 0, 0, 1},{0, 1, 2, 0},{1, 1, 0, 2},{0, 0, 0, 1}};
              e=Eigenvalues[A];
              Map[(A-e[[#[[1]]]]*IdentityMatrix[4])/(e[[#[[2]]]]-e[[#[[1]]]])&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]


              generates your twelve matricies with i not equal to j.



              Put Dot@@ in front of that Map to form the dot product of the 12 matricies.



              That works by forming every possible distinct i,j pair and then using those in the Map



              If it might be easier to read you can also write it this way



              Map[(ei=e[[#[[1]]]];ej=e[[#[[2]]]];
              (A-ei*IdentityMatrix[4])/(ej-ei))&,
              DeleteCases[Tuples[Range[4],2],{i_,i_}]]






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Mar 29 at 19:28

























              answered Mar 29 at 19:04









              BillBill

              5,89569




              5,89569












              • $begingroup$
                Should e[[#[[2]]]]-e[[[[1]]]] be e[[#[[2]]]]-e[[#[[1]]]]?
                $endgroup$
                – That Gravity Guy
                Mar 29 at 19:12










              • $begingroup$
                @ThatGravityGuy Yes! Good catch. Thank you! Corrected.
                $endgroup$
                – Bill
                Mar 29 at 19:14


















              • $begingroup$
                Should e[[#[[2]]]]-e[[[[1]]]] be e[[#[[2]]]]-e[[#[[1]]]]?
                $endgroup$
                – That Gravity Guy
                Mar 29 at 19:12










              • $begingroup$
                @ThatGravityGuy Yes! Good catch. Thank you! Corrected.
                $endgroup$
                – Bill
                Mar 29 at 19:14
















              $begingroup$
              Should e[[#[[2]]]]-e[[[[1]]]] be e[[#[[2]]]]-e[[#[[1]]]]?
              $endgroup$
              – That Gravity Guy
              Mar 29 at 19:12




              $begingroup$
              Should e[[#[[2]]]]-e[[[[1]]]] be e[[#[[2]]]]-e[[#[[1]]]]?
              $endgroup$
              – That Gravity Guy
              Mar 29 at 19:12












              $begingroup$
              @ThatGravityGuy Yes! Good catch. Thank you! Corrected.
              $endgroup$
              – Bill
              Mar 29 at 19:14




              $begingroup$
              @ThatGravityGuy Yes! Good catch. Thank you! Corrected.
              $endgroup$
              – Bill
              Mar 29 at 19:14











              0












              $begingroup$

              Another way:



              ClearAll[t];
              t[j_Integer, A_?SquareMatrixQ] := t[j, A, Eigenvalues@A]; (* add the eigenvalues *)
              t[j_Integer, A_?SquareMatrixQ, evs_?VectorQ] /; Length@A == Length@evs := (* arg checks *)=
              Fold[
              #1.(A - #2 IdentityMatrix[Length@A])/(evs[[j]] - #2) &,
              IdentityMatrix[Length@A],
              Pick[evs, Unitize[evs - evs[[j]]], 1] (* Pick nonzero differences *)
              ];


              Performance tuning: One can use DeleteCases[evs, e_ /; e == evs[[j]]] to pick the eigenvalues that give a nonzero difference. It makes no consistent difference to the timing on a 101 x 101 machine real matrix. One can save a little time by computing the identity matrix once and using With to inject it in the two places it occurs. One can also save time using dot = (dot = Dot; #2) & instead of Dot to skip the multiplication by the identity matrix (the first step of Fold). The differences evs - evs[[j]] appear twice, so they can be replaced by a single computation like the identity matrix. It can make up to a 10% improvement.






              share|improve this answer









              $endgroup$


















                0












                $begingroup$

                Another way:



                ClearAll[t];
                t[j_Integer, A_?SquareMatrixQ] := t[j, A, Eigenvalues@A]; (* add the eigenvalues *)
                t[j_Integer, A_?SquareMatrixQ, evs_?VectorQ] /; Length@A == Length@evs := (* arg checks *)=
                Fold[
                #1.(A - #2 IdentityMatrix[Length@A])/(evs[[j]] - #2) &,
                IdentityMatrix[Length@A],
                Pick[evs, Unitize[evs - evs[[j]]], 1] (* Pick nonzero differences *)
                ];


                Performance tuning: One can use DeleteCases[evs, e_ /; e == evs[[j]]] to pick the eigenvalues that give a nonzero difference. It makes no consistent difference to the timing on a 101 x 101 machine real matrix. One can save a little time by computing the identity matrix once and using With to inject it in the two places it occurs. One can also save time using dot = (dot = Dot; #2) & instead of Dot to skip the multiplication by the identity matrix (the first step of Fold). The differences evs - evs[[j]] appear twice, so they can be replaced by a single computation like the identity matrix. It can make up to a 10% improvement.






                share|improve this answer









                $endgroup$
















                  0












                  0








                  0





                  $begingroup$

                  Another way:



                  ClearAll[t];
                  t[j_Integer, A_?SquareMatrixQ] := t[j, A, Eigenvalues@A]; (* add the eigenvalues *)
                  t[j_Integer, A_?SquareMatrixQ, evs_?VectorQ] /; Length@A == Length@evs := (* arg checks *)=
                  Fold[
                  #1.(A - #2 IdentityMatrix[Length@A])/(evs[[j]] - #2) &,
                  IdentityMatrix[Length@A],
                  Pick[evs, Unitize[evs - evs[[j]]], 1] (* Pick nonzero differences *)
                  ];


                  Performance tuning: One can use DeleteCases[evs, e_ /; e == evs[[j]]] to pick the eigenvalues that give a nonzero difference. It makes no consistent difference to the timing on a 101 x 101 machine real matrix. One can save a little time by computing the identity matrix once and using With to inject it in the two places it occurs. One can also save time using dot = (dot = Dot; #2) & instead of Dot to skip the multiplication by the identity matrix (the first step of Fold). The differences evs - evs[[j]] appear twice, so they can be replaced by a single computation like the identity matrix. It can make up to a 10% improvement.






                  share|improve this answer









                  $endgroup$



                  Another way:



                  ClearAll[t];
                  t[j_Integer, A_?SquareMatrixQ] := t[j, A, Eigenvalues@A]; (* add the eigenvalues *)
                  t[j_Integer, A_?SquareMatrixQ, evs_?VectorQ] /; Length@A == Length@evs := (* arg checks *)=
                  Fold[
                  #1.(A - #2 IdentityMatrix[Length@A])/(evs[[j]] - #2) &,
                  IdentityMatrix[Length@A],
                  Pick[evs, Unitize[evs - evs[[j]]], 1] (* Pick nonzero differences *)
                  ];


                  Performance tuning: One can use DeleteCases[evs, e_ /; e == evs[[j]]] to pick the eigenvalues that give a nonzero difference. It makes no consistent difference to the timing on a 101 x 101 machine real matrix. One can save a little time by computing the identity matrix once and using With to inject it in the two places it occurs. One can also save time using dot = (dot = Dot; #2) & instead of Dot to skip the multiplication by the identity matrix (the first step of Fold). The differences evs - evs[[j]] appear twice, so they can be replaced by a single computation like the identity matrix. It can make up to a 10% improvement.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 2 days ago









                  Michael E2Michael E2

                  150k12203482




                  150k12203482






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Mathematica Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      Use MathJax to format equations. MathJax reference.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f194194%2fskipping-indices-in-a-product%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      數位音樂下載

                      When can things happen in Etherscan, such as the picture below?

                      格利澤436b