【问题标题】:Undefined function 'lt' for input arguments of type 'cell'. in using cell'cell' 类型的输入参数的未定义函数 'lt'。在使用细胞
【发布时间】:2016-01-27 14:20:47
【问题描述】:

我的老师让我们在 MATLAB 中编写 Huffmam Coding 的程序,但我遇到了一个问题:

“cell”类型的输入参数的未定义函数“lt”。

work5455 中的错误(第 49 行)

这是哪一行:

if(cell{k+1}(1)<cell{k}(1)&&cell{k}(2)==-1)

既然没有'lt',我该如何解决呢? 我的老师太忙了,没有时间回复我的电子邮件...... 这是代码(未完成),非常感谢!

fprintf('Reading data...')
data=imread('C:\Users\dell\Desktop\2.png');
data=rgb2gray(data);
data=uint8(data);
fprintf('Done!\n')

if~isa(data,'uint8'),
    error('input argument must be a uint8 vector')
end
f=repmat(0,1,256);
len=length(data);
for j=0:255
    for i=1:len
        if data(i)==j;
            f(j)=f(j)+1;
        end
    end
end

f=double(f./len);

simbols=find(f~=0);
f=f(simbols);
[f,sortindex]=sort(f)
simbols=simbols(sortindex)

len=length(simbols);
codeword=cell(1,len);
huffnode=cell(1,2*len);
for i=1:len
    cell{i}={f(i),-1,-1,-1};
end
for i=len+1:2*len-1
    cell{i}={-1,-1,-1,-1};
end

m=len
%for i=1:len
for j=1:len+i-1
    m=m-1;
    for k=1:m
        if(cell{k+1}(1)<cell{k}(1)&&cell{k}(2)==-1)
            cell{2*len}=cell{k+1};
            cell{k+1}=cell{k};
            cell{k}=cell{2*len};
        end
    end
end

【问题讨论】:

  • 不要覆盖代码中的内置变量,例如 cell、i、j 等。这至少可以清理部分混乱
  • 我猜lt 的意思是“小于”
  • 不要使用cell作为变量名

标签: matlab cell


【解决方案1】:

单元格{k+1}(1) 的输出是一个 1x1 单元格。由于您无法将单元格与其他单元格进行比较,因此您必须先使用 cell2mat 进行数据类型转换才能获取数字本身。使用

if(cell2mat(cell{k+1}(1))<cell2mat(cell{k}(1))&&cell2mat(cell{k}(2))==-1)

应该可以解决您的问题。
由于 cell 是 matlab 中的内置函数,我强烈建议重命名您的变量。正如@AndrasDeak 在 cmets 中所述,否则您稍后可能会遇到问题。一般来说,你永远不应该使用内置函数名作为你的变量名或函数名。请注意i 和j 代表matlab 中的虚数单位,因此也不应该用作迭代变量。

【讨论】:

  • 我会更加强调内置部分:在定义变量 cell 之后尝试使用 var=cell(1,len) 可能会导致越界错误。
  • @AndrasDeak 更加强调是什么意思?我应该把它放在帖子的开头并省略“即使它会起作用”部分吗?
  • @Max 最好,是的。这是一种自我保护。如果我们在 MATLAB 中教导新手覆盖内置函数是不好的,那么我们将来会得到更少令人困惑的错误,这些错误最终源于覆盖函数;它也将使 OP 成为一个更好的程序员,他采用了比他目前拥有的更清晰的编码实践。
  • 嗯,这是你的答案,这完全取决于你。我只是想让你考虑一下,在这种情况下,使用 cell 作为变量名不仅仅是不好的做法,而且很危险。如果我是你,我不会把它放在前面,因为错误是由于比较造成的,但我会单独说明为什么使用 cell 作为变量名是危险的。但同样,如果你不这样做,我不会反对你:)
  • @Adriaan 好点!使用cell 作为单元类型变量的变量名就像是在用枪从杀手身上逃跑时朝自己的脚开枪。它不会杀死你,但其他东西可能会。我会说,如果真的需要一个变量名i 或j 应该可以覆盖它们(因为1i 建议用于虚数单位并且重载只会在当前范围内),但是开发人员应该知道他的工作并喜欢其他名字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多