Octave 9.2中contour函数报错:X,Y,Z需为实数值矩阵
Octave中contour函数触发类型错误的解决方法
错误详情
error: contourc: X, Y, and Z must be real numeric matrices
error: called from contourc at line 110 column 5 contour at line 146 column 14 contour at line 80 column 18 classification1 at line 19 column 3
问题场景
这段代码来自Coursera课程《Introduction to Data, Signal, and Image Analysis with MATLAB》,在Octave 9.2中运行时触发上述错误。已确认X、Y和cls均为double类型,尺寸一致为4x8,且基础contour调用可正常执行,但当前代码无法运行。
原代码
function classification1() load fisheriris pkg load statistics [~,~,s] = unique(species); figure(1); plot(meas(s==1 ,1), meas(s==1, 2), 'rx') hold on plot(meas(s==2 ,1), meas(s==2, 2), 'go') plot(meas(s==3 ,1), meas(s==3, 2), 'b*') xlabel('Feature 1'); ylabel('Feature 2'); legend('setosa', 'versicolor', 'virginica'); [X,Y] = meshgrid(4:.01:8, 2:.01:4.5); cls = my_iris_classifier([X(:), Y(:)]); cls = reshape(cls, size(X)); contour(X, Y, cls==1,[1,1], 'r--'); contour(X, Y, cls==2, [1, 1], 'g--'); contour(X, Y, cls==3, [1, 1], 'b--'); endfunction function class = my_iris_classifier(feat) class = zeros(size(feat,1),1); for i = 1:size(feat,1); if feat(i,1) > 6 class(i) = 3; elseif feat(i,2) > 3 class(i) = 1; else class(i) = 2; endif endfor endfunction
问题原因
Octave的contour函数对输入参数类型校验比MATLAB更严格:cls==1这类比较操作返回的是逻辑布尔矩阵,而非contour要求的实数值矩阵——即使逻辑值在数值上等价于1和0,Octave仍会判定类型不匹配。
解决方法
将逻辑矩阵显式转换为数值矩阵即可,两种可行方式:
方式1:使用强制类型转换操作
在比较表达式后添加+0或*1,将布尔值转为数值:
contour(X, Y, cls==1 + 0,[1,1], 'r--'); contour(X, Y, cls==2 + 0, [1, 1], 'g--'); contour(X, Y, cls==3 + 0, [1, 1], 'b--');
方式2:使用double()函数显式转换
直接调用double()将逻辑矩阵转为double类型的数值矩阵:
contour(X, Y, double(cls==1),[1,1], 'r--'); contour(X, Y, double(cls==2), [1, 1], 'g--'); contour(X, Y, double(cls==3), [1, 1], 'b--');
修改后,contour函数就能识别Z参数为合法的实数值矩阵,代码即可正常运行。
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

