starting indexing of an array at values greater than 1

37 visualizaciones (últimos 30 días)
Matt N
Matt N el 10 de Feb. de 2015
Editada: Stephen23 el 12 de Feb. de 2015
Hi,
I would like to reindex specific arrays to start at given user input values
for example: A = [1,2,3;4,5,6;7,8,9];
start_values = input('Please enter start values in brackets'); >> [3,3]
%some function for index conversion of A to start at 3,3
%then i can reference the matrix this way
display(A(3,3));
ans =
1
%and therefore i could also call
display(A(5,5));
ans =
9
%%%%%%%%%%%%%%%%%%%%%%%%%%%
P.S. this is for correlating local stiffness coefficients to a global stiffness coefficient in the direct stiffness method.
thanks!

Respuestas (2)

Stephen23
Stephen23 el 10 de Feb. de 2015
Editada: Stephen23 el 11 de Feb. de 2015
Just save the origin-indices in a variable. Then simply subtract them from all the indices after that. You could even make a function to help you do this:
>> A = [1,2,3;4,5,6;7,8,9];
>> X = [3,3]; % origin
>> fun = @(x,y)sub2ind(size(A),1+x-X(1),1+y-X(2));
>> A(fun(3,3))
ans = 1
>> A(fun(5,5))
ans = 9
  4 comentarios
Jan
Jan el 11 de Feb. de 2015
I agree with Stephen: Instead of reinventing the indexing methods of the programming language, simply add the required offset to the indices.
David Young
David Young el 11 de Feb. de 2015
Matt N asked: "I would actually like to make the re-indexing permanent for each index, so that I can call the values at anytime without the need of the function. Is that possible?"
I think it is possible in one sense - see my answer.

Iniciar sesión para comentar.


David Young
David Young el 11 de Feb. de 2015
All MATLAB arrays are indexed from 1, but an alternative to Stephen Cobeldick's answer is to make an array Ashifted such that the value of A(1,1) is at Ashifted(3,3) and so on. Like this:
% test data
A = [1,2,3;4,5,6;7,8,9];
start_values = [3 3];
% construct shifted matrix
rowStart = start_values(1);
colStart = start_values(2);
Ashifted = NaN(size(A,1)+rowStart-1, size(A,2)+colStart-1);
Ashifted(rowStart:end, colStart:end) = A;
% check if it has worked
disp(Ashifted(3,3)); % same as A(1,1)
disp(Ashifted(4,5)); % same as A(2,3)
If you are happy to lose the original indexing, you can assign Ashifted to A.
Note that this uses extra memory, because Ashifted has extra rows and columns. I've filled them with NaN values to show they're not meaningful data.
Whether it's preferable to use this approach or to add an offset to the indices each time you access A depends on a number of factors, with tradeoffs in memory, time and code complexity.
  2 comentarios
David Young
David Young el 11 de Feb. de 2015
Incidentally, I agree with the comments above that overriding subsref is not something worth undertaking.
Stephen23
Stephen23 el 11 de Feb. de 2015
Editada: Stephen23 el 12 de Feb. de 2015
Accidentally setting the origin to [1e7,1e7] could be very interesting... this method is good for low indices, but is not a general solution.
It also completely removes the ability to use several of MATLAB's rather useful indexing methods :
  • A(1,:) would not return the first data row
  • A(1) would not return the first data value
  • A(:) is not a vector of all data values
  • etc
In fact it completely removes the ability to use the colon to select a whole row/column (x,:), because this would always include the padding values.

Iniciar sesión para comentar.

Categorías

Más información sobre Matrices and Arrays en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by