logical matrix divided by double matrix is slow

a=logical(12,90,111);
b=randi(100,[12,90,111]);
c = a ./ (b+1e-10).
This line seems a very simple operation but it is so time-consuming. I am wondering if any speed up can be done?

 채택된 답변

Walter Roberson
Walter Roberson 2018년 5월 21일

0 개 추천

You are executing that line 8675040 times and it is taking 84367.53 seconds to do so, which is an average of 0.00972531884579207 seconds per iteration. Is that slow? 12*90*111 = 119880 divisions are done each time, for an average of 8.1125449164098e-08 seconds per division. Is that slow?
The code internally has to do
double(a) ./ (b+1e-10)
which is an extra operation compared to the case where a is already double. Those extra operations take time.
That said, my tests do tend to suggest that doing the double() yourself is faster, by up to a factor of 5. Try
c = double(a) ./ (b+1e-10);

댓글 수: 1

Oh, yes, you are right. the double operation speed up the code by 5 times. Thank you very much!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Image Analyst
Image Analyst 2018년 5월 21일

0 개 추천

What is the last line in your post???
When I run your code I get this:
Error using logical
Too many input arguments.
Error in test2 (line 1)
a=logical(12,90,111);
When I do this:
a=false(12,90,111);
b=randi(100,[12,90,111]);
tic;
c = a ./ (b+1e-10);
toc
I get
Elapsed time is 0.000511 seconds.
which seems pretty fast to me. What are you doing differently?

댓글 수: 2

1 For the error, the first line should be changed to a=zeros(12,90,111,'logical') to make the code run.
2 This line will run 8675040 times, which takes a longer time.
Well change it to false, which is also a logical, and it will run so much faster.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Programming에 대해 자세히 알아보기

태그

질문:

2018년 5월 21일

댓글:

2018년 5월 21일

Community Treasure Hunt

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

Start Hunting!

Translated by