Editing multiple elements of an array in one line

19 views (last 30 days)
My problem is this, I have a huge array and I want to edit multiple elements of the same array that I know the location of. Here's how I would assume this should work based on how matlab handles arrays
h = zeros(10,10,10,2); % just a simple example array
b = [10 5]; % elements I want to place in new location
i = [1 2]; % "locations" I want to place them in
h = h(1,1,1,i) + b(i)
Now what I would expect is for h(1,1,1,1) = 10 and h(1,1,1,2) = 5. But instead what you get is h(1,1,1,1) = [10 5] and h(1,1,1,2) = [10 5]
Why is this? I know a solution is to simple edit them in a loop, however this isn't actually answering the problem.
Thanks

Accepted Answer

Rik
Rik on 16 May 2018
The error you get for your example will probably depend the release. On R2018a, the implicit expansion tries to expand b to fit the 4D selection from h. What I needed to do is make sure that b is 1x1x1x(numel(b)):
h = zeros(10,10,10,2); % just a simple example array
b = [10 5]; % elements I want to place in new location
i = [1 2]; % "locations" I want to place them in
h(1,1,1,i) = h(1,1,1,i) + permute(b(:),numel(size(h)):-1:1);
h(1,1,1,1)
h(1,1,1,2)
  2 Comments
Kyle Ruzic
Kyle Ruzic on 16 May 2018
Sorry I edited the question as you were typing your answer to change h(1,1,1,i) to just h, which is what I was doing to produce the result I mentioned in the question.
I'm a bit confused by how this
permute(b(:),numel(size(h)):-1:1);
is changing the size of b.
Thanks for the quick response!
Rik
Rik on 16 May 2018
If you read the doc for permute, you can see that it changes the order of the dimensions, so in this case, the 2x1 vector resulting from the b(:) operation, is changed. A 2x1 vector is the same as a 2x1x1x1 array, so permute uses the vector [4 3 2 1] (the output of numel(size(h)):-1:1)) to change this to 1x1x1x2, which fits the excerpt from h defined by the h(1,1,1,i) operation.

Sign in to comment.

More Answers (0)

Products


Release

R2018a

Community Treasure Hunt

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

Start Hunting!