How to make this simple script faster?
2 ビュー (過去 30 日間)
古いコメントを表示
Each of the Sta{i}.test is a one-column data with unknown number of rows. As you know, to keep expanding Variable X is not the most efficient way of doing this.
Is there a way I can get my X values faster without writing a loop?
X = [];
for i = a:b
if isfield(Sta{i}, 'test')
X = [X; Sta{i}.test];
end
end
Many thanks!
1 件のコメント
Image Analyst
2020 年 2 月 3 日
編集済み: Image Analyst
2020 年 2 月 3 日
Are you saying that sometimes the structure inside the cell might not have a field called "test"? What if you just allocated X as, say, 10 million elements or way more than you ever expect to have, then crop to the proper length after the loop. See my Answer below (scroll down).
採用された回答
Image Analyst
2020 年 2 月 3 日
編集済み: Image Analyst
2020 年 2 月 3 日
Does this work:
X = zeros(10000000, 1);
a = 1;
b = length(Sta);
lastIndex = 0
for i = a:b
if isfield(Sta{i}, 'test')
t = Sta{i}.test;
lt = length(t);
X(lastIndex+1:lastIndex+lt) = t;
lastIndex = lastIndex + lt;
end
end
X = X(1:lastIndex);
What is the size of Sta? How many elements does it have?
3 件のコメント
Image Analyst
2020 年 2 月 3 日
編集済み: Image Analyst
2020 年 2 月 3 日
It might be. I experimented with doing things like (:) and {:} and putting stuff in brackets and using vertcat() but I just couldn't find the exact syntax that would do it. You'd have to experiment around some.
Can you store them in a more convenient way in the first place?
その他の回答 (1 件)
David Hill
2020 年 2 月 3 日
You could preallocate X with nan to the largest expected and then delete the excess nan's at the end.
X = nan(10000000,1);
count=1;
for i = a:b
if isfield(Sta{i}, 'test')
temp=count+length(Sta{i}.test);
X(count:temp-1) = Sta{i}.test;
count=temp;
end
end
X=X(~isnan(X));
参考
カテゴリ
Help Center および File Exchange で System-Level Simulation についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!