1

假设我有矩阵 A 和 B。我想创建第三个矩阵 C,其中

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。没有其他号码。我需要完成的是将矩阵 1 中的元素 [x1,y1] 附加到矩阵 2 的 [x1,y1] 中的元素。然后将该值附加到矩阵 3 的 [x1,y1] 中。

另一个例子:

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]
4

3 回答 3

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;

您还可以通过定义这个简单的函数将任意长度的 0 和 1 行向量转换为其十进制等效值:

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 上绝对是少数派,所以请接受它的价值。

于 2013-11-07T06:12:00.723 回答
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)
于 2013-11-07T05:39:09.740 回答
0

我看到了一些非常广泛的答案,所以也许这想得太简单了,但是假设您有代表二进制数的 1 和 0 的向量,这又如何:

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

C = 10*A + B

这应该给你你想要的数字,你可能想要添加前导零。当然,这种方法可以很容易地扩展为附加多个矩阵,您只需要在添加之前确保它们之间有一个因子(基数)10。

于 2013-11-07T13:38:21.263 回答