Intuitive numeric value for indicating ':' and 'end'
이전 댓글 표시
I am working on a mex routine that will accept indexing vectors. I would like this vector to be able to use the equivalent of ':' and 'end' with numeric values. I have two options I am considering:
Option (1) 0 = ':' , inf = 'end'
Example: Suppose x is a 2x3x4 array, then the equivalent of x(:,2,end) would be arguments (x,[0 2 inf])
Option (2) 0 = 'end' , inf = ':'
Example: Suppose x is a 2x3x4 array, then the equivalent of x(:,2,end) would be arguments (x,[inf 2 0])
I am leaning towards Option 1 for the method to be used for my mex routine, since inf seems to be intuitive for 'end' and that leaves 0 to mean ':'.
Does anyone have any other thoughts as to which method is more intuitive, or why one method might be more or less intuitive than the other? Or maybe there are already other functions out there that do something similar and a convention for this has already been established? Or maybe NaN values would be more intuitive for some reason? Etc.
댓글 수: 5
Greg Dionne
2018년 1월 19일
That's a generally difficult question to answer, as it is quite subjective. Some caution should be taken here, since users are likely to attempt to compute the endpoints of a range programmatically elsewhere and expect statements like ifinal = istop - 2 to work correctly when istop is your sentinel value. Arithmetic on Inf and NaN won't satisfy this need.
You could try extending your Option (1) to operate modulo the size of your array. So 0 would be equivalent to end, -1 would be equivalent to end-1, etc. You should take care to document that in triplicate though, since this introduces its own set of difficulty during debug (search for "negative indices python" to see some precedent for this).
Steven Lord
2018년 1월 19일
Your approach may lead to an ambiguous input.
x = rand(2, 3, 4);
y = x(:, [1 2], [3 2]);
How would your MEX function parse [0 1 2 3 2]? As above or:
z = x(:, [1 2 3], 2);
You might want to accept an indexing struct array (as can be created using the substruct function) instead of a vector. This documentation page lists some cases you may need or want to consider.
James Tursa
2018년 1월 19일
Walter Roberson
2018년 1월 20일
It is not uncommon in programming languages for -1 to indicate end, -2 the value before that and so on. It is uncommon for 0 to represent the end, especially since 0 is a common starting point.
James Tursa
2018년 1월 30일
답변 (1개)
Steven Lord
2018년 1월 20일
I originally posted this as a comment rather than an answer because I hadn't thought at first that my message was an answer. It started as a request for clarification. But I suppose my suggestion about substruct counts as a potential answer.
Your approach may lead to an ambiguous input.
x = rand(2, 3, 4);
y = x(:, [1 2], [3 2]);
How would your MEX function parse [0 1 2 3 2]? As above or:
z = x(:, [1 2 3], 2);
You might want to accept an indexing struct array (as can be created using the substruct function) instead of a vector. This documentation page lists some cases you may need or want to consider.
댓글 수: 1
James Tursa
2018년 1월 20일
편집: James Tursa
2018년 1월 20일
카테고리
도움말 센터 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!