2013-11-07 4 views
1

Скажем у меня есть матрицы A и B. Я хочу, чтобы создать третью матрицу С, гдеДобавление данных «в пути» несколько матриц

A = [1,0,0,1] 

B = [1,0,1,0]  

C = [11, 00, 01, 10] 

Есть ли такая функция в Matlab? Если нет, то как я могу начать создавать функцию, которая делает это?

Редактировать: C - не буквальные числа. Они являются конкатенированными значениями A, B по элементам.

Edit2: Фактическая проблема, с которой я имею дело, - это 10 больших матриц размера [x, y], где x, y> 1000. Элементы в этих матрицах имеют 0 и 1 сек. Никакого другого номера. То, что мне нужно выполнить, - это добавить элемент [x1, y1] в матрицу 1 к элементу в [x1, y1] матрицы 2., а затем это значение добавится к [x1, y1] матрицы 3.

Другой пример:

A = [1,1,1,1; 
    0,0,0,0] 

B = [0,0,0,0; 
    1,1,1,1] 

C = [1,0,1,0; 
    0,1,0,1] 

И мне нужна матрица D, где

D = [101, 100, 101, 101; 010, 011, 010, 011] 
+0

По 'C = [11, 00, 01, 10]' вы буквально означаете «одиннадцать, ноль, один, десять» или вы имеете в виду что-то еще? Вы пытаетесь выполнить двоичные операции? – nispio

+0

Пытается выполнять двоичные операции, но у меня есть несколько матриц 0s и 1s. C буквально не число, а двоичные числа. Но я хотел бы объединить A и B по элементам. – Phirip

+0

Я думал, что это выглядит слишком легко. :) Итак, эти строки? Как это будет выглядеть в MATLAB? – chappjc

ответ

2

Это зависит от того, как вы хотите, чтобы вывод отформатирован. Вы могли бы применить bitshift для численных значений и преобразования в двоичную:

>> b = dec2bin(bitshift(A,1)+B) 

b = 

    11 
    00 
    01 
    10 

Для общей матрицы Digits:

>> Digits 

Digits = 

    1  0  0  0 
    0  1  0  0 
    1  0  1  1 
    1  1  0  0 
    1  0  0  0 
    1  0  1  1 
    1  1  0  0 
    1  0  1  0 
    0  1  1  1 
    0  1  1  1 

>> Ddec = D*(2.^(size(D,2)-1:-1:0))'; % dot product 
>> dec2bin(Ddec) 

ans = 

1000 
0100 
1011 
1100 
1000 
1011 
1100 
1010 
0111 
0111 

Другой способ написать это dec2bin(sum(D .* repmat(2.^(size(D,2)-1:-1:0),size(D,1),1),2)).

Для вашей большей проблемы, с 10 большими матрицами (скажу M1, M2, ..., M10), вы можете создать стартовую Digits матрицы путем:

Digits = [M1(:) M2(:) M3(:) M4(:) M5(:) M6(:) M7(:) M8(:) M9(:) M10(:)]; 

Если это обратный порядок из цифры, просто сделайте Digits = fliplr(Digits);.

Если вы не хотите что-либо изменить форму вы можете вычислить значение матрицы десятичного из матриц цифр следующим образом:

M = cat(3,A,B,C); 
Ddec = sum(bsxfun(@times,M,permute(2.^(size(M,3)-1:-1:0),[1 3 2])),3) 
+0

А! Я считаю, что вторая часть делает то, что я ищу, спасибо большое! – Phirip

+0

Darn, этот метод запутывается, когда задействовано больше строк и столбцов. Бывают ли быстрые исправления, где он будет делать num2str concatenate, когда есть несколько столбцов, строк? – Phirip

+0

@Phirip - Как вы хотите обратиться к схеме именования переменных? Вероятно, лучше всего иметь матрицу, где количество столбцов - это несколько цифр (0 с 1 с), а количество строк - разные числа, которые вы хотите собрать. Например, 'D = randi (2,10,4) -1' Как насчет этого? – chappjc

3

Я рекомендую вам избегать манипулирования двоичных чисел в виде строк, где это возможно. Это кажется заманчивым, и есть случаи, когда Matlab обеспечивает более элегантное решение, если вы обрабатываете двоичное число как строку, но вы не можете выполнять двоичную арифметику по строкам. Вы всегда можете работать с целыми числами, как если бы они были двоичными (в конце концов они хранятся как биты в вашей машине), а затем только отображают их как двоичные числа, используя dec2bin, когда это необходимо.

A = [1,0,0,1] 
B = [1,0,1,0] 
C = bitshift(A,1)+B; 
display(dec2bin(C)); 

В другом случае вы показываете в вашем вопросе вы можете использовать:

A = [1,1,1,1; 0,0,0,0]; 
B = [0,0,0,0; 1,1,1,1]; 
C = [1,0,1,0; 0,1,0,1]; 
D = bitshift(A,2) + bitshift(B,1) + C; 

Вы можете также преобразовать произвольную длину строки вектор из нулей и единиц в его десятичный эквивалент, определив эту простую функцию:

mat2dec = @(x) x*2.^(size(x,2)-1:-1:0)'; 

Это также будет работать и для матриц. Например,

>> M = [0 0 1; 0 1 1; 0 1 0; 1 1 0; 1 1 1; 1 1 0; 1 0 0]; 
>> dec2bin(mat2dec(M)) 

ans = 

001 
011 
010 
110 
111 
110 
100 

По моему опыту, обработка двоичных чисел как строк приводит к запутыванию вашего кода и не очень гибкая. Например, попробуйте добавить две двоичные «строки» вместе. Вы должны использовать bin2dec каждый раз, так почему бы просто не оставить числа в виде цифр, пока вы не хотите их отображать? Вы уже столкнулись с некоторыми проблемами, вызванными строками разной длины. Вы будете удивлены, как одно простое изменение может сломать все при обработке чисел как строк. Хуже всего то, что алгоритм может отлично работать для одного набора данных, а не для другого. Если все, с чем я тестирую, это двоичные двоичные числа и трехбитное число каким-то образом пробирается внутрь, я не вижу ошибки, но мои результаты будут необъяснимо неверными. Я понимаю, что это очень субъективная проблема, и я думаю, что я определенно выступаю в меньшинстве на StackOverflow, поэтому возьмите его за то, что он стоит.

+0

Это, наверное, отличный совет. Я просто не знаю другого способа сделать проблему, если у меня нет двоичного числа, которое легко использовать. То, что мне в конечном итоге нужно сделать, это иметь двоичные числа, которые на самом деле являются номерами GrayCode. Мне нужно будет взять эти числа и преобразовать их в двоичные числа. Затем двоичные числа десятичны (это самая простая часть). Переход к GrayCode в двоичный файл из множества матриц - вот что меня толкает! – Phirip

+0

Согласовано. Вот почему я закончил «dec2bin» в моем примере - чтобы продемонстрировать значение цифр. Лучше всего просто работать в цифрах. @Phirip - я добавил gernal решение для любого количества цифр. – chappjc

+0

Я рекомендую вам начать новый вопрос, который касается конкретных проблем, с которыми вы сталкиваетесь с Gray Code. – nispio

0

Я вижу некоторые довольно обширные ответы так, возможно, это мышление слишком просто, но как насчет просто это если у вас есть векторы единицы и нули, представляющие ваши двоичные числа:

A = [1,0,0,1]; 
B = [1,0,1,0]; 

C = 10*A + B 

Это должно дать вам число, хотите, вы можете добавить начальные нули. Конечно, этот метод можно легко расширить, чтобы добавить несколько матриц, вам просто нужно убедиться, что перед добавлением есть фактор (база) 10.

+0

См. Мою первую редакцию моего ответа. Это была шутка, но до того, как вопрос был прояснен и расширен, он, безусловно, ответил на вопрос. – chappjc