数组和 matlab 编码器的问题

Posted

技术标签:

【中文标题】数组和 matlab 编码器的问题【英文标题】:Issues with arrays and matlab coder 【发布时间】:2018-04-12 16:14:56 【问题描述】:

我一直致力于使用 Matlab-coder 创建 c 代码。我有一个名为 melfunction 的函数,它在下面代码的第 20 行给出错误。

function [ c ] = melfunction( x )

bank=melbankm(24,256,8000,0,0.4,'t');  
bank=full(bank); %full() convert sparse matrix to full matrix  
bank=bank/max(bank(:));

w=1+6*sin(pi*[1:12]./12);
w=w/max(w); 
xx=double(x);  
xx=filter([1-0.9375],1,xx); 
xx=enframe(xx,256,80)
p = zeros(1,256); < --------------------- SOLUTION CHANGE TO p = zeros(256)
m = zeros(1,12);  < --------------------- SOLUTION CHANGE TO p = zeros(12)

for i=1:size(xx,1)  
  y=xx(i,:);  
  s=y'.*hamming(256);  
  t=abs(fft(s));
  t=t.^2; 
  p(i,:) = t; < --------------------------- ERROR HERE
  c1=dctcoef*log(bank*t(1:129));  
  c2=c1.*w';  
  m(i,:)=c2;  
end 

错误信息如下所示

使用 melfunction 时出错(第 20 行) 索引超出数组维度。索引值 2 超出数组 p 的有效范围 [1-1]。

TESTINPUTS 中的错误(第 2 行) d0=melfunction(x)

如果我想出答案,我会在找到答案后发布。

【问题讨论】:

该行不会导致该错误。请看:minimal reproducible example 我已经更新了完整的代码。我没有添加它只是变量变坏的实际部分......我指向的代码行也是我认为我必须改变一些东西的地方......抱歉造成混乱跨度> 关于数据大小和形状的一个或多个假设是错误的。您已将p 初始化为行向量,然后在第二次循环迭代中尝试处理它没有的行@​​987654324@。因此,您的索引超出了数组维度。 @excaza 是否有任何您知道的方法可以解决此问题。 【参考方案1】:

好的,所以我弄乱了一点,发现我相信我不知道如何正确初始化 p 和 m 。为了尝试为 Matlab-Coder 的另一部分添加这些代码行,我错误地初始化了 p 和 m 变量。这是最初的初始化。

p = zeros(1,256); m = zeros(1,12);

这也是我改变的。

p = zeros(256);
m = zeros(12);

【讨论】:

以上是关于数组和 matlab 编码器的问题的主要内容,如果未能解决你的问题,请参考以下文章

Matlab 编码器:Matlab 数组到 C 数组

将 C 字符数组转换为 Matlab 字符串 [Matlab 编码器]

使用 matlab 编码器时嵌套循环出错,但是根本没有嵌套

Matlab 编码器 - 需要一个标量。 IF 或 WHILE 不支持非标量

Matlab 编码器和动态字段参考

matlab读取motorola编码