I'm writing a MATLAB function to read out data into an n-dimensional array (variable dimension size). I need to be able to access a specific point in the Matrix (to write to it or read it, for example), but I don't know ahead of time how many indexes to specify.
Currently I have a current_point
vector which I iterate through to specify each index, and a max_points
vector which specifies the size of the array. So, if for example I wanted a 3-dimensional array of size 1000-by-15-by-3, max_points = [1000 15 3]
, and current_point
iterates from [1, 1, 1]
to [1000, 15, 3]
([1, 1, 1]
-> [1000, 1, 1]
-> [1, 2, 1]
-> [1000, 2, 1]
->...). What I'd like to be able to do is feed current_point
as an index to the matrix like so:
output_matrix(current_point) = val
But apparently something like output_matrix([1 2 3]) = val
will just set outputmatrix(1:3) = 30
. I can't just use dummy variables because sometimes the matrix will need 3 indexes, other times 4, other times 2, etc, so a vector of variable length is really what I need here. Is there a simple way to use a vector as the points in an index?
An index matrix is a matrix with exactly one non-zero entry per row. Index matrices are useful for mapping observations to unique covariate values, for example.
Let A be an n×n complex matrix. The smallest nonnegative integer k such that rank(Ak+1)=rank(Ak), is the index fo A and denoted by Ind(A).
Since you desire the elements to be populated by rows, a trick is to simply transpose the result. In general, you want to reshape a N element vector V into a square matrix M of size sqrt(N) x sqrt(N) in row-major order. You can do this for the general case: N = sqrt(numel(V)); M = reshape(V, N, N).
Vector Indexing, or vector index notation, specifies elements within a vector. Indexing is useful when a MATLAB program only needs one element of a series of values. Indexing is often used in combination with repetition structures to conduct the same process for every element in an array.
Using the function sub2ind
to create a linear index is the typical solution to this problem, as shown in this closely-related question. You could also compute a linear index yourself instead of calling sub2ind
.
However, your case may be simpler than those in the other questions I linked to. If you're only ever indexing a single point with your current_point
vector (i.e. it's just an n-element vector of subscripts into your n-dimensional matrix), then you can use a simple solution where you convert current_point
to a cell array of subscripts using the function num2cell
and use it to create a comma-separated list of indices. For example:
current_point = [1 2 3 ...]; % A 1-by-n array of subscripts
subCell = num2cell(current_point); % A 1-by-n cell array of subscripts
output_matrix(subCell{:}) = val; % Update the matrix point
The operation subCell{:}
creates the equivalent of typing subCell{1}, subCell{2}, ...
, which is the equivalent of typing current_point(1), current_point(2), ...
.
I know it is too late but for anybody who will find this topic. the easiest way that work for me is to use: diag(A (x(:),y(:)) )
;
unfortunately this works only if you need to get values from the matrix, not for changing values
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With