在做大矩阵的运算,发现占用太多内存,于是在好友jcyao的提醒下,将double类型改为uint8类型内存是原来的1/8.(我的问题可以使用整形,其他问题不一定使用)。在网上搜到一篇如何选择变量类型的文章,写的很清楚,先摘下来。其网站matlabtips.com 上面有很多好的建议和优化方法。
Choose your variables wisely…
Posted on March
21, 2012 by Jerome
I
am stuck home with a big fever so I hope this post is going to make sense. We’ll see! I named it against a miracle remedy that I would love to have under my hand.
One of the fundamental choices any programmer has to make is to decide on a particular data type for each one of his variable. In
the past, Matlab used to work only with double data type. But now, it has been extended to a variety of class that it is important you know. Still, contrary to C, Matlab has a default datatype (Double), so you can get along for a long time without bothering
about this. But, in fact, double is a very very conservative choice that you rarely need. Memory usage of variables is often overlooked.
There are 11 numerical data type : Double, Single, Int8, Int16, Int32, Int64,Uint8, Uint16, Uint32, Uint64,
Logical. These data types are different in the way they store information and their intrinsic resolution. Please take a look at the following table :
Class | Max value | Min Value | Bytes | Smallest difference |
logical | 1 | 0 | 1 (yes, Matlab wastes 7 bits here) | 1 |
int8 | 127 | -128 | 1 | 1 |
int16 | 32767 | -32768 | 2 | 1 |
int32 | 2.14e+09 | -2.14e+09 | 4 | 1 |
int64 | 9.22e+18 | -9.22e+18 | 8 | 1 |
uint8 | 255 | 0 | 1 | 1 |
uint16 | 65535 | 0 | 2 | 1 |
uint32 | 4.29e+09 | 0 | 4 | 1 |
uint64 | 1.84e+19 | 0 | 8 | 1 |
single | 3.40e+038 | -3.40e+038 | 4 | 1.1755e-38 |
double | 1.79e+308 | -1.79e+308 | 8 | 2.2251e-308 |
Single and double are not stored the same way as integer. They are “floating-point”. This means that instead of using the full 64 bits to store the actual value of the number, some of these bits are dedicated to store the position of the “point”. This enable
Matlab to allow a much larger range of numbers than expected with a pure 64 bits coding (as can be seen when you compare double and int64).
Indeed, as you can see, they have very very different range. Double has a huge range of values available to it (10^308!). If you need to store real data (as oppose to integer) than single is most likely good enough for you. You’ll save half of your memory usage!
S0me c0mplicated mathematical operations do need double to avoid numerical inaccuracy but 99% of the time you are good to go. Besides Matlab will tell you before hand. Most Matlab functions can take both single and double.
Integers are good if you only need to apply simple arithmetic to your data. You can still divide 2 integers but the result is rounded to the closest integer. In image processing, for instance, nearly all the function can take any data type.
Why is all this important? let’s consider two examples :
- If you record at 100 kHz (this is a standard data rate for many acquisition cards), for 100 seconds, you ends up with 10^7 data points. In double precision that means 80 Megabytes. This is quite heavy on memory but more importantly, on hard drive if you want
to save your trace. - If you are playing with movies, it becomes even more critical to use the smallest data type as possible. For example, any camera can record around 500 by 500 pixels. If you image at 20 Hz (just faster than persistence of vision), than 100 seconds of movie is
500 x 500 x 20 Hz x 100 seconds x 8 = 4 Gigabytes in memory in double precision! Most of the time, camera give you a 16 or even 8 bit integer, so you can save a factor of 4 in memory and on your hard drive (I am not talking about compressing the data yet,
this is raw).
另外还有很多MatlAB的优化方法,很有意思:
-
Categories
- ▼Learning
Matlab- ▼Beginners
- A
guide to guide : Video tutorial to start making interfaces - A variable ID card
- Choose
your variables wisely... - Code is poetry
- Computer
vs human memory - Function
and sub-functions - How
to share your figure in the cloud - Inline your lines
- Kickstarting
Matlab - lesson 1 - Look for the loop
- Making interfaces
for beginners - Mathematical
operations in Matlab and the point - On Matlab editor
- Plot fundamentals
- Preallocation
is not an option - Recursive functions
- Stucked?
How to get some help. - The
art of vectorizing - Part 1 - The
past, present and future of numerical computing - The
secret rule for good Matlab code - Understanding
for loops... - Using strings
in Matlab - What IF?
- A
- ?Intermediate
- ?Advanced
- ▼Beginners
- ?Making
interfaces - ▼Optimizing
your code- Choose
your variables wisely... - Code is poetry
- Columns
and Rows are not the same - Copy on Write
- Copy
on Write in subfunctions - How
to load Tiff stacks fast, really fast! - Inline your lines
- Look for the loop
- Mathworks
has listened to our TIFF prays! - Matlab
is no longer slow at for loops - On fractal graphics
- Preallocation
is not an option - Some places,
some rules - The
art of vectorizing - Part 1 - The
art of vectorizing - Part 2 - The
art of vectorizing - Part 3 - The
secret rule for good Matlab code - Using pointers
in Matlab - Waiting for
the waitbar - What
happen at my place, stays at my place - What‘s
the difference between AND and AND AND?
- Choose
- ?Annoyances
- ?Various
- ▼Learning