Reputation: 865
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
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 aseval(expression)
except that anything that would normally be written to the command window, except for error messages, is captured and returned in the character arrayT
(lines inT
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
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