Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use a vector as an index to a matrix

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?

like image 402
Paul Avatar asked May 05 '11 21:05

Paul


People also ask

What is an index in a matrix?

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.

How do you find the index of a matrix?

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).

How do you convert a vector to a square matrix?

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).

What is an indexing vector?

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.


2 Answers

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), ....

like image 156
gnovice Avatar answered Oct 09 '22 16:10

gnovice


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

like image 38
Pavel Avatar answered Oct 09 '22 16:10

Pavel