How can i do it fast way ?
1 view (last 30 days)
Show older comments
example = mat2cell(rand(100000,4),ones(1,100)*1000,4);
result = cell( size(example, 1), 1);
var1_list = [0.5, 0.7];
var2_list = [0.3, 0.5, 0.7];
final = cell( length(var1_list)*length(var2_list), 1);
cnt = 1;
for var1 = var1_list
for var2 = var2_list
for i = 1 : size(example, 1)
index1 = find( (example{i, 1}(:, 2) >= var1 )==1);
index2 = find( (example{i, 1}(:, 3) >= var2 )==1);
index = intersect(index1, index2);
if ~isempty(index)
result{i, 1} = index;
end
end
final{cnt, 1} = result;
cnt = cnt + 1;
end
end
How can i do it fast way ? or How can i convert to gpuarray?
1 Comment
Jan
on 18 Feb 2021
Ary you really sure, that you do not want to update result{i,1}, if no intersection was found?
Accepted Answer
Jan
on 18 Feb 2021
Edited: Jan
on 18 Feb 2021
3 times faster: Replace
index1 = find( (example{i, 1}(:, 2) >= var1 )==1);
index2 = find( (example{i, 1}(:, 3) >= var2 )==1);
index = intersect(index1, index2);
if ~isempty(index)
result{i, 1} = index;
end
by:
index1 = find(all(example{i, 1}(:, 2:3) >= [var1, var2], 2));
if ~isempty(index1)
result{i, 1} = index1;
end
And a further duplication of the speed:
index1 = (example{i, 1}(:, 2) >= var1 & ...
example{i, 1}(:, 3) >= var2);
if any(index1)
result{i, 1} = find(index1);
end
I'd expect something like
if any(index)
result{i, 1} = find(index1);
else % Reset value from former iteration?!
result{i, 1} = [];
end
but maybe this behavior is wanted. In the random tests data, this situation never happens. But if you want to set reslut{i} to [], this is faster than the IF-method above:
index1 = (example{i, 1}(:, 2) >= var1 & ...
example{i, 1}(:, 3) >= var2);
result{i} = find(index1); % Note: {i} is the same as {i, 1}
More Answers (0)
See Also
Categories
Find more on Matrices and Arrays in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!