以“某种方式”附加多个矩阵

时间:2013-11-07 05:33:32

标签: matlab matrix

假设我有矩阵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]

3 个答案:

答案 0 :(得分: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;

您还可以通过定义此简单函数将零和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中的少数人,所以请把它当作它的价值。

答案 1 :(得分: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个大矩阵(例如M1M2,...,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)

答案 2 :(得分:0)

我看到了一些相当广泛的答案,所以也许这个想法太简单了,但假设你有一个零和0的向量代表你的二进制数字,那怎么样:

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

C = 10*A + B

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