Optimizing for loops by searching some data in cell arrays

2 ビュー (過去 30 日間)
Nik Rocky
Nik Rocky 2020 年 12 月 1 日
コメント済み: Shubham Gupta 2020 年 12 月 7 日
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
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
Nik Rocky
Nik Rocky 2020 年 12 月 2 日
Hello, Array will be created by another "black box" script. I attach one of these files:

サインインしてコメントする。

回答 (1 件)

Shubham Gupta
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 件のコメント
Nik Rocky
Nik Rocky 2020 年 12 月 3 日
編集済み: Nik Rocky 2020 年 12 月 3 日
Hello Shubham! Thank you very much for your work! I try to implement your code but I get error:
z = cellfun(@(c)c(find(c==t_interpl(t_ref_cnt))+size(c,1)),Traj_interpl,'UniformOutput',false);
y = cellfun(@(c)~isempty(c),z);
motorspeed_detected = zeros(size(Traj));
motorspeed_detected(y)=z{y};
Unable to perform assignment with 0 elements on the right-hand side.
Error in Analysis_algorithm_11_11_20_RealHW (line 207)
motorspeed_detected(y)=z{y};
(I rename a x to z, because it will be allready used)
Do you see a possible error? See attatchement with Traj_interpl and t_interpl
Shubham Gupta
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 ExchangePerformance and Memory についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by