In[]:=
deploy
Thu 28 Jul 2022 11:35:37

Comparing versions

In[]:=
d=300;​​numSamples=d;​​sigma=DiagonalMatrix[Table[1.,{i,1,d}]];​​dist=MultinormalDistribution[sigma];​​data=RandomVariate[dist,numSamples];​​data=Normalize/@data;​​​​(*Versionfromhttps://mathematica.stackexchange.com/a/37357/217*)​​GramSchmidt[w_?MatrixQ]:=Module[{v=ConstantArray[0,Length[w]]},​​Table[v[[n]]=w[[n]]-Sum[(v[[i]].w[[n]]/v[[i]].v[[i]])*v[[i]],{i,1,n-1}],{n,1,Length[w]}];​​v];​​​​​​(*modifiedversionfromhttps://mathematica.stackexchange.com/a/101463/217*)​​proj[u_,v_]:=v.u/u.uu;​​gsOrthogonal[vectorSet_?MatrixQ]:=Map[With[{norm=Norm[#]},If[norm>0,#,#]]&,Fold[Function[{spanVec,v},Join[spanVec,{v-Total@Map[proj[#,v]&,spanVec]}]][#1,#2]&,{vectorSet[[1]]},Drop[vectorSet,1]]];​​​​GramSchmidt2[M_]:=With[{qr=QRDecomposition[Transpose[M]]},Diagonal[Last[qr]]*First[qr]];​​​​Print["Built-in timing: ",First@Timing@Orthogonalize[data]]​​Print["version1 timing: ",First@Timing@GramSchmidt@data]​​Print["version2 timing: ",First@Timing@gsOrthogonal@data]​​Print["version3 timing: ",First@Timing@GramSchmidt2@data]​​Print["Correctness check: ",Max[Flatten@Abs[GramSchmidt2[data]-GramSchmidt[data]]]<
-10
10
]​​
Built-in timing: 0.076631
version1 timing: 4.26753
version2 timing: 0.177025
version3 timing: 0.018694
Correctness check: True

Orthogonalize with custom dot product

In[]:=
data={{2,3,5},{7,11,13},{17,19,23}};​​f=
Dot[#1,#2]
Norm[#1]Norm[#2]
&;​​result=Orthogonalize[data,f,Method->"GramSchmidt"]//N;​​Outer[f,result,result,1]//MatrixForm
Out[]//MatrixForm=
1.
0.970876
0.939529
0.970876
1.
0.966066
0.939529
0.966066
1.
In[]:=
data={{2,3,5},{7,11,13},{17,19,23}};​​f=
Dot[#1,#2]
Norm[#1]Norm[#2]
&;​​result=Orthogonalize[data,f,Method->"GramSchmidt"]//N;​​Outer[f,result,result,1]//MatrixForm
Out[]//MatrixForm=
1.
0.970876
0.939529
0.970876
1.
0.966066
0.939529
0.966066
1.
In[]:=
data={{2,3,5},{7,11,13},{17,19,23}};​​f=Dot;​​result=Orthogonalize[data,f,Method->"GramSchmidt"]//N;​​Outer[f,result,result,1]//Chop//MatrixForm
Out[]//MatrixForm=
1.
0
0
0
1.
0
0
0
1.
In[]:=
data={{2,3,5},{7,11,13},{17,19,23}};​​GramSchmidt[w_?MatrixQ]:=Module[{v=ConstantArray[0,Length[w]]},​​Table[v[[n]]=w[[n]]-Sum[(v[[i]].w[[n]]/v[[i]].v[[i]])*v[[i]],{i,1,n-1}],{n,1,Length[w]}];​​v];​​f=
Dot[#1,#2]
Norm[#1]Norm[#2]
&;​​result=GramSchmidt[data];​​Outer[f,result,result,1]//MatrixForm
Out[]//MatrixForm=
1
0
0
0
1
0
0
0
1

Test with Gram-Schmidt

In[]:=
data={{2,3,5},{7,11,13},{17,19,23}};​​GramSchmidt[w_?MatrixQ]:=Module[{v=ConstantArray[0,Length[w]]},​​Table[v[[n]]=w[[n]]-Sum[(v[[i]].w[[n]]/v[[i]].v[[i]])*v[[i]],{i,1,n-1}],{n,1,Length[w]}];​​v];​​f=
Dot[#1,#2]
Norm[#1]Norm[#2]
&;​​result=GramSchmidt[data];​​Outer[f,result,result,1]//MatrixForm​​result//MatrixForm
Out[]//MatrixForm=
1
0
0
0
1
0
0
0
1
Out[]//MatrixForm=
2
3
5
21
19
41
19
-
33
19
48
13
-
27
13
-
3
13

Testing with gsOrthonormal

In[]:=
data={{2,3,5},{7,11,13},{17,19,23}};​​​​proj[u_,v_]:=v.u/u.uu;​​gsOrthogonal[vectorSet_?MatrixQ]:=Map[With[{norm=Norm[#]},If[norm>0,#,#]]&,Fold[Function[{spanVec,v},Join[spanVec,{v-Total@Map[proj[#,v]&,spanVec]}]][#1,#2]&,{vectorSet[[1]]},Drop[vectorSet,1]]];​​result=gsOrthonormal[data];​​result//MatrixForm​​
Out[]//MatrixForm=
2
3
5
21
19
41
19
-
33
19
48
13
-
27
13
-
3
13