2015-02-19 2 views
0

A1 и A2 - это два массива целых чисел с одинаковыми размерами 6000x2000.Преобразование двух матриц в одну матрицу с использованием двоичных чисел

Я хочу найти третью матрицу B, выполнив следующие действия:

for i=1:1:6000 
    for j=1:2000 

     a1 = fliplr(dec2binvec(A1(i,j),14)); % Convert A1(i,j) to a binary vector 
     a2 = fliplr(dec2binvec(A2(i,j),32)); % Convert A2(i,j) to a binary vector 

     b = [a1 a2]; 

     B(i,j) = sum(b.*2.^(numel(b)-1:-1:0)); % Convert b to decimal 


    end 
end 

моя проблема времени вычисления, чтобы найти B.

Есть ли способ избежать циклов, чтобы сократить время вычислений?

Пример:

A1 = [2 3   A2 = [7 6 
     4 5]    2 9] 

A1(1,1) = 2 и A2(1,1) = 7

a1 = [0 0 0 1 0] (например, 5 бит) a2 = [0 0 0 1 1 1] (например, 6 бит)

b = [a1 a2] = [0 0 0 1 0 0 0 0 1 1 1] 

B1(1,1) = sum(b.*2.^(numel(b)-1:-1:0)) = 135 
+1

Пожалуйста, пост небольшой числовой пример (скажем, с матрицами 2х2), уточнить порядок байт и т.д. –

+1

'dec2binvec' возвращает младший бит первый, но 'b. * 2.^(numel (b) -1: -1: 0)' сначала использует его как старший старший бит. Вы подтвердили, что действительно получаете то, что хотите с помощью этого кода? – Daniel

+0

@ LuisMendo: Я добавил пример. – bzak

ответ

1

Я предполагаю, что пример содержит то, что вы хотите. Просто используйте математику;)

A1 = [2 3;4,5] 
A2=[7 6;2 9] 
A1.*2^6+A2 

Обратите внимание, что двойники могут содержать до 53 бит без потери точности. Последние версии поддержки matlab поддерживают uint64. Для еще более длинного номера проверьте vpa, но vpa приведет к медленному коду.

+0

Благодарим вас за дополнительную информацию. – bzak

+0

52 бит или 53 бит? – bzak

+0

52: http://en.wikipedia.org/wiki/Double-precision_floating-point_format – Daniel

1

Если я правильно понимаю ваш пример правильно, вам нужно всего лишь бит-сдвиг A1 (т.е. умножить на 2):

M = 5; %// not used actually 
N = 6; 
B = A1 * 2^N + A2; 

В вашем примере, это дает

B = 
    135 198 
    258 329 
4

Используя ваш пример:

A1 = [2 3;   
     4 5];    
A2 = [7 6; 
     2 9]; 
B=bitshift(A1,6)+A2 

Выход:

B = 

    135 198 
    258 329 
+0

Плюс 1 для 'битхифт'. Мне нравится эта функция. – rayryeng

+0

@rayryeng Спасибо, я думаю, для кого-то, не привыкшего работать в двоичном коде, он разъясняет, что умножение на силу 2 делает с числом. – beaker

+0

Yup it обязательно! – rayryeng