oski86
oski86

Reputation: 865

How to disable outputting variables inside Octave function

I wrote my own function for Octave, but unfortunately aside of the final result value, the variable "result" is written to console on every change, which is an unwanted behavior.

>> a1 = [160 60]
a1 =

   160    60

>> entr = my_entropy({a1}, false)
result =  0.84535
entr =  0.84535

Should be

>> a1 = [160 60]
a1 =

   160    60

>> entr = my_entropy({a1}, false)
entr =  0.84535

I don't get the idea of ~ and it don't work, at least when I tried. Code is as follows:

# The main difference between MATLAB bundled entropy function
# and this custom function is that they use a transformation to uint8
# and the bundled entropy() function is used mostly for signal processing
# while I simply use a straightforward solution usefull e.g. for learning trees

function f = my_entropy(data, weighted)
  # function accepts only cell arrays;
  # weighted tells whether return one weighed average entropy
  # or return a vector of entropies per bucket
  # moreover, I find vectors as the only representation of "buckets"
  # in other words, vector = bucket (leaf of decision tree)
  if nargin < 2
    weighted = true;
  end;

  rows = @(x) size(x,1);
  cols = @(x) size(x,2);

  if weighted
    result = 0;
  else
    result = [];
  end;

  for r = 1:rows(data)

    for c = 1:cols(data) # in most cases this will be 1:1

      omega = sum(data{r,c});
      epsilon = 0;

      for b = 1:cols(data{r,c})
        epsilon = epsilon + ( (data{r,c}(b) / omega) * (log2(data{r,c}(b) / omega)) );
      end;

      if (-epsilon == 0) entropy = 0; else entropy = -epsilon; end;

      if weighted
        result = result + entropy
      else
        result = [result entropy]
      end;

    end;

  end;

  f = result;

end;

# test cases

cell1 = { [16];[16];[2 2 2 2 2 2 2 2];[12];[16] }
cell2 = { [16],[12];[16],[2];[2 2 2 2 2 2 2 2],[8 8];[12],[8 8];[16],[8 8] }
cell3 = { [16],[3 3];[16],[2];[2 2 2 2 2 2 2 2],[2 2];[12],[2];[16],[2] }

# end

Upvotes: 0

Views: 89

Answers (2)

Luis Mendo
Luis Mendo

Reputation: 112659

Add ; after result = result + entropy and result = [result entropy] in your code, or in general after any assignment that you don't want printed on screen.


If for some reason you can't modify the function, you can use evalc to prevent unwanted output (at least in Matlab). Note that the output in this case is obtained in char form:

T = evalc(expression) is the same as eval(expression) except that anything that would normally be written to the command window, except for error messages, is captured and returned in the character array T (lines in T are separated by \n characters).

As with any eval variant, this approach should be avoided if possible:

entr = evalc('my_entropy({a1}, false)');

Upvotes: 3

eventHandler
eventHandler

Reputation: 1211

In your code, you should end lines 39 and 41 with semicolon ;.

Lines finishing in semicolon aren't shown in stdout.

Upvotes: 4

Related Questions