Optimizing for loops by searching some data in cell arrays
2 次查看(过去 30 天)
显示 更早的评论
Hello,
I'm searching in multiple cell-array for some data:
for traj_cnt = 1:size(Traj_interpl,2) %for every Traj-Cell
for t_row_cnt = 1:size(Traj_interpl{traj_cnt},1) %for any row of Traj
if t_interpl(t_ref_cnt) == Traj_interpl{traj_cnt}(t_row_cnt,1) %if right row of Traj is choosen
motorspeed_detected(traj_cnt) = Traj_interpl{traj_cnt}(t_row_cnt,2); %write detected value to motorspeed_detected array
break; %just one success possible
else
motorspeed_detected(traj_cnt) = 0; % write 0 to motorspeed_detected array
end
end
end
Sometimes there are too much cells and rows, so is takes long long time and matlab in else state. What can I do to optimize a code?
traj_cnt is a variable of number of cells
Traj_interpl is a big cell array
t_row_cnt is a variable rows in one cell
t_interpl(t_ref_cnt) is a counting time variable (+10 ms) (initialisation outside)
Traj_interpl{traj_cnt}(t_row_cnt,1) is a saved time in cell arrays that I'm looking vor
Traj_interpl{traj_cnt}(t_row_cnt,2) is a saved motor value in cell array tham I try to save
motorspeed_detected array with detected values
So, I'm looking for special time in first column of cell arrays and if I find this, I take a value from second coloumn and save it to motorspeed_detected array.
How can I save resources? Thank you!
2 个评论
Mathieu NOE
2020-12-2
hello
so how did you generate that array ?
there is probably a way to do a validity test without for loops
回答(1 个)
Shubham Gupta
2020-12-3
I tried cellfun() to get the desired output without using for loops:
x = cellfun(@(c)c(find(c==t_interpl(t_ref_cnt))+size(c,1)),Traj_interpl,'UniformOutput',false);
y = cellfun(@(c)~isempty(c),x);
motorspeed_detected = zeros(size(Traj));
motorspeed_detected(y)=x{y};
It might not be the most efficient way to do this but it definitely improves efficiency of the code by removing for loops.
2 个评论
Shubham Gupta
2020-12-7
Sorry for being late to comment, I believe that sometimes "y" is a vector with logical zeros only. That means, you can't always find "t_interpl" inside "Traj_interpl", so you such have to detect such cases and using if....else condition execute last line only when there is at least one non-zero element. I hope it helps!
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Performance and Memory 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!