Indexing of cell array and a vector

6 次查看(过去 30 天)
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 个评论
Stephen23
Stephen23 2024-6-2
编辑:Stephen23 2024-6-2
"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?
Sergio Rojas Blanco
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

请先登录,再进行评论。

采纳的回答

Star Strider
Star Strider 2024-6-2
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]}
.

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

产品


版本

R2024a

Community Treasure Hunt

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

Start Hunting!

Translated by