22

In Mathematica there are different objects like InterpolatingFunction or SparseArray? How can I define a custom data object with special data structure?

Example:

f = Interpolation[{1, 2, 3, 5, 8, 5}];
f // InputForm

returns us

InterpolatingFunction[{{1, 6}}, {4, 3, 0, {6}, {4}, 0, 0, 0, 0, Automatic}, 
{{1, 2, 3, 4, 5, 6}}, {{1}, {2}, {3}, {5}, {8}, {5}}, {Automatic}]

But if one evaluates the above output one gets back

InterpolatingFunction[{{1, 6}}, <>]

I could not find any documentation how to do it for any custom data object that I want to define for my program.

István Zachar
  • 47,032
  • 20
  • 143
  • 291
PlatoManiac
  • 14,723
  • 2
  • 42
  • 74

2 Answers2

22

Format is what you are looking for: Create a data structure, something like this:

mkMyData[d1_, d2_] := MyData[d1, d2]
GetD1[a_MyData] := a[[1]]
GetD2[a_MyData] := a[[2]]
Format[MyData[d1_, d2_]] := "MyData[<" <> ToString[Length[d1] + Length[d2]] <> ">]"

Call the constructor:

data = mkMyData[Range[5], q]

(* "MyData[<5>]" *)

Call a selector:

GetD1[data]

(* {1, 2, 3, 4, 5} *)

14

As Michael Pilat explained here it is more robust to use MakeBoxes, rather than Format.

Using MakeBoxes:

MakeBoxes[diag[m_?MatrixQ], _] ^:= 
  InterpretationBox[RowBox[{"diag", "[", #, ",", #2, "]"}], diag[m]] & @@
    ToBoxes /@ {Dimensions[m], Diagonal[m]}

Here is a definition for handling Part extraction:

diag[m_?MatrixQ][[part___]] ^:= m[[part]]

Result:

mat = DiagonalMatrix[{1, 2, 3, 4, 5}];

diag[mat]
diag[{5, 5}, {1, 2, 3, 4, 5}]
diag[mat][[2]]
{0, 2, 0, 0, 0}
Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
  • Is there a way to handling Apply or Function for your example, ie. such that diag[mat]["Something"] would result specified result? – Karolis Jul 07 '16 at 13:49
  • 1
    @Karolis I think you are looking for (7999)? The formatting rule (with MakeBoxes) should be independent of other definitions so this form should still work, e.g. diag[m_?MatrixQ]["Det"] := Det[m] and then diag[mat]["Det"] evaluates to 120 just as Det[mat] does. – Mr.Wizard Jul 07 '16 at 20:40