Indexing of cell array and a vector

Hi guys, my problem has been raised before but with some differences.
I have a cell array of indexes, index. Its cells can be zero or vectors with several values. On the other hand I have a data vector, data. I need a cell array, out, that relates data to indexes, preferably without using a loop.
For example:
index = {[0], [0], [5], [0], [6, 7], [0], [0], [1], [0], [0], [0], [ 3]} ;
data = [100, 10, 20, 15, 11, 25, 200, 45];
Desired result:
out = {[0], [0], [11], [0], [25, 200], [0], [0], [100], [0], [0], [20]}
Can somebody help me?

4 Comments

"preferably without using a loop."
Why?
Hi Stephen23, my data cell is quite large and I think a loop would be slower, right?
Stephen23
Stephen23 on 2 Jun 2024
Edited: Stephen23 on 2 Jun 2024
"I think a loop would be slower, right?"
A well-written FOR-loop would likely be faster than code using CELLFUN, ARRAYFUN, or anything else.
Who taught you the oddly-persistent myth that FOR-loops are slow?
Actually, I don't know the internal process of cellfun or arrayfun. Possibly, they perform a loop and, therefore, it would be difficult to choose the most efficient procedure, but I don't know, and I have assumed that loops take longer. It would have to be checked experimentally.
In any case, I thank you very much for your contributions. They have helped me a lot

Sign in to comment.

 Accepted Answer

One approach —
index = {[0], [0], [5], [0], [6, 7], [0], [0], [1], [0], [0], [0], [ 3]} ;
data = [100, 10, 20, 15, 11, 25, 200, 45];
q = cellfun(@(x) data(x(x>0)), index, 'Unif',0);
Lvc = cellfun(@(x) all(x==0), index, 'Unif',0); % Using 'all' Is Necessary To Make The Logical Indices Work Correctly
out = index;
out(~[Lvc{:}]) = q(~[Lvc{:}])
out = 1x12 cell array
{[0]} {[0]} {[11]} {[0]} {[25 200]} {[0]} {[0]} {[100]} {[0]} {[0]} {[0]} {[20]}
.

2 Comments

It works! Thank you very much :D
As always, my pleasure!

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Release

R2024a

Community Treasure Hunt

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

Start Hunting!