假设我有矩阵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]
答案 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个大矩阵(例如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)
答案 2 :(得分:0)
我看到了一些相当广泛的答案,所以也许这个想法太简单了,但假设你有一个零和0的向量代表你的二进制数字,那怎么样:
A = [1,0,0,1];
B = [1,0,1,0];
C = 10*A + B
这应该为您提供所需的数字,您可能需要添加前导零。当然,这个方法可以很容易地扩展到附加多个矩阵,你只需要确保在添加之前它们之间有一个因子(基数)10。