MATLAB中生成7位随机消息的CRC代码报错问题求助
解决MATLAB CRC代码中随机消息生成的维度不匹配问题
嘿,这个问题我太熟了!本质就是向量维度不匹配搞的鬼,咱们一步步来捋清楚:
问题根源
你原代码里的msg是行向量(比如[1 0 1 1 0 0 1 0 1]是1行9列的结构),但用randi([0, 1], 7,1)生成的是7行1列的列向量。当执行mseg=[msg zeros(1,N-1)]时,你试图把一个列向量和一个行向量做水平拼接(horzcat),MATLAB要求拼接的两个矩阵行数必须一致,这里7行≠1行,自然就抛出了Dimension mismatch的错误。
两种解决方案
方案1:直接生成行向量的随机消息
把randi的维度参数调换顺序,生成1行7列的行向量,和原代码的维度逻辑完全匹配:
% 生成7位行格式的随机消息 msg = randi([0, 1], 1, 7); poly = [1 0 1 1]; [M, N] = size(poly); mseg = [msg zeros(1,N-1)]; [q, r] = deconv(mseg,poly); r = abs(r); for i=1:length(r) a=r(i); if mod(a,2) == 0 r(i)=0; else r(i)=1; end end crc = r(length(msg)+1:end); frame = bitor(mseg,r);
方案2:将列向量转置为行向量
如果你一定要用列向量生成(比如其他逻辑依赖列向量结构),只需要加一行转置操作,把列向量转成行向量再执行后续代码:
% 生成列向量后转置为行向量 msg = randi([0, 1], 7, 1); msg = msg'; % 关键:转置为1行7列的行向量 poly = [1 0 1 1]; [M, N] = size(poly); mseg = [msg zeros(1,N-1)]; [q, r] = deconv(mseg,poly); r = abs(r); for i=1:length(r) a=r(i); if mod(a,2) == 0 r(i)=0; else r(i)=1; end end crc = r(length(msg)+1:end); frame = bitor(mseg,r);
额外小优化
你那个循环判断奇偶的部分,可以用MATLAB的向量化操作简化,不用写for循环,效率更高:
% 替换原有的for循环 r = mod(abs(r), 2);
这一行代码就能实现和原循环完全一样的效果,把r里的元素都转成0或1的二进制值。
内容的提问来源于stack exchange,提问作者Masoum
相关产品推荐
相关产品推荐

