2017-03-01 160 views
0

我有十進制數字矩陣,我知道我可以將它們轉換使用此代碼二進制文件:(IEEE 754雙精度二進制)生成隨機數字在特定的二進制範圍

m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]); 
b_recovered = reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b)); 

使用此代碼,我認爲最後8位是最重要的位。 我想生成隨機十進制數並將這些元素替換爲8,最後一個位在替換爲生成的隨機數後不會改變。我需要有一個新的號碼,同時保留最後8位。

例如:

b=-1.12; 
m=1110110001010001101110000001111010000101111010111111000110111111; 

改爲:

m=0000110000000000001110000000011010000001100010000010000110111111; 

等於:

b=-1.337678432804527e-04 

我知道我可以在兩個號碼,但之間產生隨機小數我不知道如何解決上述問題。

mymatrix(1:q,:)= value2 + (value2-value1).*rand(q,size(y_blk,2)); 
+0

你究竟想在這裏實現什麼?將數字從十進制轉換爲二進制數,更改前56位,然後將其轉換回十進制?似乎有一個快捷方式,取決於您期望的最終結果... – Wolfie

+0

生成0到255(8位)之間的整數並將其轉換爲二進制。 – mpaskov

+0

@mpaskov不是那麼簡單... 8最後一位不等於0-255 – Hanna

回答

1

保持第一56將最後8

生成0255之間的整數,並將其轉換爲二進制。用它們替換你序列的前8位。

b=-1.12; 
m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]); 
m_small = [dec2bin(randi(256)-1,8), m(9:end)] 
m_large = [m(1:end-8),dec2bin(randi(256)-1,8)] 
b_small = reshape(typecast(uint8(bin2dec(reshape(m_small,8,[]).')),'double'),size(b)); 
b_large = reshape(typecast(uint8(bin2dec(reshape(m_large,8,[]).')),'double'),size(b)); 

b_small的值很難改變,表明前8位是最不重要的。 b_large變化很大,所以最後8個是最重要的位。


保持過去的8,將前56

誤會你希望保留最後8位和更換其他的問題。在這種情況下,生成56位隨機數據​​並添加您保存的最後8個數據。現在,事實證明,Matlab只能生成2^53的最大整數。代替產生一個高達2^56的整數,產生7個每個都是2^8,並連接它們。

m_new = [reshape(dec2bin(randi(2^8,[7,1])-1,8),[1,56]), m(end-7:end)] 
b_new = reshape(typecast(uint8(bin2dec(reshape(m_new,8,[]).')),'double'),size(b)); 
+0

我可以保留位57和58嗎? – Hanna

+1

是的,你可以保存'm(end-7:end-5)'並在末尾添加'dec2bin(randi(2^6)-1,6)'。 – mpaskov