Pour déboguer mon code Octave / MATLAB, je veux pouvoir faire quelque chose comme:

A = magic(3);
b = 42;
describe(@A, @b);

Et obtenez une sortie comme:

filename.m line 3: "A" is a 3x3 matrix
filename.m line 3: "b" is a scalar of value: 42

Pour plusieurs variables, comment puis-je imprimer le:

  • Appel du fichier et de la ligne de la fonction
  • Nom
  • Type
  • Dimensions
4
Tom Hale 27 juil. 2017 à 12:18

2 réponses

J'utilise moi-même quelque chose de similaire. Voici la mienne:

function describe(A)
  fprintf('       Class : %s\n',class(A));
  fprintf('  Num. Elems : %s\n',num2str(numel(A)));  
  fprintf('        Size : %s\n',num2str(size(A)));
  fprintf('   Total Min : %s\n',num2str(min (A(:))));
  fprintf('   Total Max : %s\n',num2str(max (A(:))));  
  fprintf('   Total Sum : %s\n',num2str(sum (A(:))));
  fprintf('  Total Mean : %s\n',num2str(mean(A(:))));
  fprintf('Total St.Dev : %s\n',num2str(std (A(:), 1)));
  fprintf(' Unique vals : %s\n',num2str(length(unique(A))));  
end

Modifier: je sais que ce n'est pas une réponse littérale à ce que vous demandez, mais je l'utilise tout le temps et j'ai pensé qu'il pourrait être utile de partager. :)


PS. Cela dit, il ne m'est jamais venu à l'esprit que je pourrais jamais vouloir utiliser une telle fonction de manière non interactive: si je dois inspecter des variables de cette manière, je mets simplement un point d'arrêt (ou une instruction keyboard ) dans le code, puis inspectez les éléments du terminal au point où c'est le plus pertinent, donc signaler manuellement un nom de fichier et un numéro de lin ne m'est jamais venu à l'esprit! Quel est votre cas d'utilisation dont vous avez besoin pour effectuer un débogage non interactif comme celui-ci? Si c'est à des fins de «test» post-mortem, vous devriez vraiment écrire des tests et des vérifications de bon sens à la place de toute façon!

De plus, ce n'est que pour des variables uniques, mais je trouve cela préférable; c'est une boucle à une ligne extrêmement simple si vous en vouliez plus de toute façon.

1
Tasos Papastylianou 27 juil. 2017 à 11:02

Vous pouvez utiliser size pour avoir la taille de votre variable, pour le type class et pour le nom inputname. Par exemple:

function describe(a)
  s = size(a); % Return the size of a
  t = class(a); % Return the type of a
  name = inputname(1); % Return the name of a

  printf(['filename.m line 3: ''''' name ''''' size:' s(1) 'x' s(2) ' and type: ' t]);
end

Je ne sais pas comment utiliser le nom du fichier et la ligne, et si vous voulez une autre façon d'afficher cela, vous pouvez utiliser la condition if pour séparer le scalaire du vecteur de la matrice.

0
Théo P. 27 juil. 2017 à 10:14