What does the error "error: ones: invalid data type specified" mean?

What does the error "error: ones: invalid data type specified" mean?

这是我的代码,它生成一个信号,对其进行量化、编码,然后对其进行解调。

 %Quantization
 n=8; 
 L=2^n; 
 vmax=8;
 vmin=-vmax;
 del=(vmax-vmin)/L;
 part=vmin:del:vmax;                   % level are between vmin and vmax with difference of del
 code=vmin-(del/2):del:vmax+(del/2);   % Contaion Quantized valuses 
 [ind,q]=quantiz(s,part,code);         % Quantization process
 

%  Encoding Process
figure;
code=de2bi(ind,'left-msb');   % Cnvert the decimal to binary
k=1;
l1=length(ind);
l2=length(q);
for i=1:l1
    for j=1:n
        coded(k)=code(i,j);   % convert code matrix to a coded row vector
        j=j+1;
        k=k+1;
    end
    i=i+1;
end

当我 运行 它(已经为 quantiz 函数执行了 pkg 加载通信)时,我得到了这行错误。

error: ones: invalid data type specified
error: called from
    de2bi at line 79 column 5
    PCM1 at line 33 column 6

(PCM1为文件名) 我尝试从 de2bi 函数中删除 'left-msb' 参数,这使得代码 运行 没有错误,但最终输出不正确,所以我需要 'left-msb'。 据我所知,这段代码在 MATLAB 上运行良好,但我没有 MATLAB 密钥来尝试它。

关于此错误的含义以及如何修复它有什么想法吗?数组 ind 是 double 类型,所有正值,所以我不明白为什么函数不起作用。

编辑:Octave 中的代码是 运行。删除了不必要的代码。

de2bi 的实现中,Matlab 和 Octave 之间似乎存在不兼容性。 Octave 似乎无法正确处理对 de2bi 的双输入调用,其中第二个输入是有效位标志。它要求您提供输入编号和列数作为前两个输入,然后该标志可以作为第三个输入成功处理(如果您指定不同的基数,则为第四个)。 Octave 似乎也不处理基值的空占位符,但它可以处理要显示的列数。

例如:

>> de2bi(19)
ans =
     1     1     0     0     1

在 Matlab 2020a 中,以下都产生相同的输出:

>> de2bi(19,'left-msb')
ans =
     1     0     0     1     1

>> de2bi(19,[],'left-msb')
ans =
     1     0     0     1     1

>> de2bi(19,[],[],'left-msb')
ans =
     1     0     0     1     1

但是在带有通信 pkg 1.2.2 的 Octave 5.2.0 中:

>> de2bi(19)
ans =
   1   1   0   0   1

>> de2bi(19, 'left-msb')
error: ones: invalid data type specified
error: called from
    de2bi at line 79 column 5

>> de2bi(19,[],'left-msb')
ans =
   1   0   0   1   1

>> de2bi(19,[],[],'left-msb')
ans = [](0x0)

>> de2bi(19,[],2,'left-msb')
ans =
   1   0   0   1   1

>> de2bi(19,5,2,'left-msb')
ans =
   1   0   0   1   1

在报告和修复此兼容性错误之前,目前看来最好的解决方法是使用上面倒数第二个语法,使用空占位符来表示要显示的列数,并使用 2 作为基数。此语法将在 Matlab 和 Octave 中产生相同的输出。

Bug report 59466 已在 Octave 错误跟踪器上创建。

更新:已向上述错误报告提交补丁,纠正 Octave 和 Matlab 版本的 di2be 之间不兼容的输入处理。如果在更新版本的包与补丁一起发布之前,上述解决方法还不够,则还包括 di2be.m 的兼容版本。