multidimensional colon operator?

1 view (last 30 days)
Knut
Knut on 4 Feb 2011
I want to do something like that below: copy an N-dimensional array into a N+1-dimensional array at index t in the last dimension. Can this be done efficiently and cleaner than umpteen if-tests or nasty permutes?
function A = insert_x_into_A(A,x,t)
if ndims(A) == 2
A(:,t) = x;
elseif ndims(A) == 3
A(:,:,t) = x;
elseif ndims(A) == 4
A(:,:,:,t) = x;
...
end
I think that something like the pseudo-code below would be neat
function A = insert_x_into_A(A,x,t)
A(colon(ndims(x)),t) = x;

Accepted Answer

Jan
Jan on 4 Feb 2011
Two approaches: 1. Reshape the matrix at first:
function A = insert_x_into_A(A,x,t)
siz = size(A);
A = reshape(A, [], siz(end));
A(:, t) = x(:);
A = reshape(A, siz);
2. Use a cell as index vector: EDITED: Cleaned up with Bruno's suggestion.
function A = insert_x_into_A(A,x,t)
idx(1:ndims(A) - 1) = {':'};
A(idx{:},t) = x;
  4 Comments
Jan
Jan on 4 Feb 2011
@Bruno: Nicer. I'll insert it in my approach.
Knut
Knut on 7 May 2013
Edited: Knut on 7 May 2013
Is this documented anywhere? Am I supposed to be able to do stuff like:
ord = 3;
buffN = zeros(5*ones(1,ord));
shiftidx1(1:ord) = {'2:end'};
shiftidx2(1:ord) = {'1:(end-1)'};
buffN(shiftidx1{:}) = buffN(shiftidx2{:});
(circshift seems to be made for this purpose, but it seems slow for my purpose)

Sign in to comment.

More Answers (1)

Matt Fig
Matt Fig on 4 Feb 2011
If you want to get real evil:
function A = insert_x_into_A(A,x,t)
col = repmat(':,',1,ndims(A)-1);
eval(['A(',col,'t) = x;'])
Though I don't know why you would need such a specific function.
  2 Comments
Jan
Jan on 4 Feb 2011
Matt, I can see your EVAL!
Matt Fig
Matt Fig on 4 Feb 2011
I couldn't resist. This seems like a safe application anyway.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!