Averages/Mode: Difference between revisions
Content added Content deleted
(corrected categorization of task) |
(octave (with extensive comments for the "solution" used)) |
||
Line 2: | Line 2: | ||
See also: [[Mean]], [[Median]] |
See also: [[Mean]], [[Median]] |
||
=={{header|Octave}}== |
|||
Of course Octave has the <tt>mode</tt> function; but it returns only the "lowest" mode if multiple modes are available. |
|||
<lang octave>function m = mode2(v) |
|||
sv = sort(v); |
|||
% build two vectors, vals and c, so that |
|||
% c(i) holds how many times vals(i) appears |
|||
i = 1; c = []; vals = []; |
|||
while (i <= numel(v) ) |
|||
tc = sum(sv==sv(i)); % it would be faster to count |
|||
% them "by hand", since sv is sorted... |
|||
c = [c, tc]; |
|||
vals = [vals, sv(i)]; |
|||
i += tc; |
|||
endwhile |
|||
% stack vals and c building a 2-rows matrix x |
|||
x = cat(1,vals,c); |
|||
% sort the second row (frequencies) into t (most frequent |
|||
% first) and take the "original indices" i ... |
|||
[t, i] = sort(x(2,:), "descend"); |
|||
% ... so that we can use them to sort columns according |
|||
% to frequencies |
|||
nv = x(1,i); |
|||
% at last, collect into m (the result) all the values |
|||
% having the same bigger frequency |
|||
r = t(1); i = 1; |
|||
m = []; |
|||
while ( t(i) == r ) |
|||
m = [m, nv(i)]; |
|||
i++; |
|||
endwhile |
|||
endfunction</lang> |
|||
<lang octave>a = [1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17]; |
|||
mode2(a) |
|||
mode(a) |
|||
a = [1, 1, 2, 4, 4]; |
|||
mode2(a) % returns 1 and 4 |
|||
mode(a) % returns 1 only</lang> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |
Revision as of 17:56, 13 June 2009
Averages/Mode
You are encouraged to solve this task according to the task description, using any language you may know.
You are encouraged to solve this task according to the task description, using any language you may know.
Write a program to find the mode value of a vector of integers. The case where the vector is empty may be ignored. Care must be taken to handle the case where the mode is non-unique.
Octave
Of course Octave has the mode function; but it returns only the "lowest" mode if multiple modes are available.
<lang octave>function m = mode2(v)
sv = sort(v); % build two vectors, vals and c, so that % c(i) holds how many times vals(i) appears i = 1; c = []; vals = []; while (i <= numel(v) ) tc = sum(sv==sv(i)); % it would be faster to count % them "by hand", since sv is sorted... c = [c, tc]; vals = [vals, sv(i)]; i += tc; endwhile % stack vals and c building a 2-rows matrix x x = cat(1,vals,c); % sort the second row (frequencies) into t (most frequent % first) and take the "original indices" i ... [t, i] = sort(x(2,:), "descend"); % ... so that we can use them to sort columns according % to frequencies nv = x(1,i); % at last, collect into m (the result) all the values % having the same bigger frequency r = t(1); i = 1; m = []; while ( t(i) == r ) m = [m, nv(i)]; i++; endwhile
endfunction</lang>
<lang octave>a = [1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17]; mode2(a) mode(a)
a = [1, 1, 2, 4, 4]; mode2(a) % returns 1 and 4 mode(a) % returns 1 only</lang>
Tcl
<lang tcl># Can find the modal value of any vector of values proc mode {n args} {
foreach n [list $n {*}$args] { dict incr counter $n } set counts [lsort -stride 2 -index 1 -decreasing $counter] set best {} foreach {n count} $counts { if {[lindex $counts 1] == $count} { lappend best $n } else break } return $best
}
- Testing
puts [mode 1 3 6 6 6 6 7 7 12 12 17]; # --> 6 puts [mode 1 1 2 4 4]; # --> 1 4</lang>