Matlab编程错误
我正在尝试Matlab编程课程的编程作业中的问题,作为练习。这是我自学用的 问题: 编写一个名为classify的函数,该函数接受一个输入参数x。那个 参数将不超过两个维度。如果x是空的 矩阵,函数返回-1。如果x是标量,则返回0。如果x 是一个向量,它返回1。最后,如果x不是其中的任何一个,它将返回 2.不要使用内置函数isempty、isscalar或isvector 我的代码片段:Matlab编程错误,matlab,function,matrix,vector,scalar,Matlab,Function,Matrix,Vector,Scalar,我正在尝试Matlab编程课程的编程作业中的问题,作为练习。这是我自学用的 问题: 编写一个名为classify的函数,该函数接受一个输入参数x。那个 参数将不超过两个维度。如果x是空的 矩阵,函数返回-1。如果x是标量,则返回0。如果x 是一个向量,它返回1。最后,如果x不是其中的任何一个,它将返回 2.不要使用内置函数isempty、isscalar或isvector 我的代码片段: function num = classify(x) num = -1; if(x == 3.1415926
function num = classify(x)
num = -1;
if(x == 3.14159265358979)
num = 0;
elseif(size(x, 2) == 3)
num = -1;
end
end
我在Matlab上得到了以下结果
Problem 4 (classify):
Feedback: Your function performed correctly for argument(s) []
Feedback: Your function performed correctly for argument(s) zeros(1,0)
Feedback: Your function performed correctly for argument(s) zeros(0,4)
Feedback: Your function performed correctly for argument(s) 3.14159265358979
Feedback: Your function made an error for argument(s) [1 2 3]
参数[1 2 3]有问题吗?您应该编写一个泛型函数,例如,对于任何标量输入,您的函数都不能工作,而不是
pi
使用size
功能确定输入的尺寸,例如:
>> size([])
ans = 0 0
>> size(5)
ans = 1 1
>> size([5 6 7])
ans = 1 3
>> size([5;6;7])
ans = 3 1
基于此,您的函数可以如下所示:
function [num] = classify(x)
s = size(x);
if s == [0 0]
num = -1;
elseif s == [1 1]
num = 0;
elseif sort(s) == [1 3]
num = 1;
else
num = 2;
end
end
通过计算元素的数量(即使用
numel
函数),您可以最容易地检查x
是空的还是标量的。然后,要确定它是向量还是高维矩阵,您需要检查维度数是否小于3(这是因为ndims
对于1D和2D矩阵都返回2
),并验证前两个维度中至少有一个大小为1
:
function num = classify(x)
n = numel(x);
if n < 2
num = n-1;
else
if ndims(x) < 3 && any(size(x) == 1)
num = 1;
else
num = 2;
end
end
end
function num=classify(x)
n=努美尔(x);
如果n<2
num=n-1;
其他的
如果ndims(x)<3&&any(尺寸(x)==1)
num=1;
其他的
num=2;
终止
终止
终止
如果你想要的只是代码,我会给你答案,但我建议你坐下来,试着理解这些代码是如何以及为什么解决问题的,我猜你想从中学习一些东西。好的,下面是代码:
function [num] = classify(x)
if numel(x) == 0
num = -1;
return
end
num = sum(size(x) > 1);
end
是的,您尝试将数组与浮点进行比较。 它允许对[]执行(编程错误)操作,因为数组为空
对于零,因为数组再次为空:在第一种情况下为0列,在第二种情况下为0行代码片段如何符合问题?同意,代码不做问题中提到的任何事情。您应该尝试使用有问题的输入运行程序,看看调试器告诉您什么!哦,我同意上面的评论,这并不是说你在为某个特定的案件做错事,这是因为您的代码与所述问题无关,只在非常特定的情况下工作,其中一些情况恰好是测试的情况。您的代码在任何时候都不会输出要求的
1
或2
,那么它如何工作呢?此外,此函数也会派上用场:返回2
?@m.s.该解决方案不起作用。给出了这个错误<代码>问题4(分类):反馈:您的函数对参数正确执行[]反馈:您的函数对参数0(1,0)出错。您的解决方案不正确。您的解决方案出错<代码>您的函数为参数出错[0 0 1 0 1 1 1 0;1 1 0 0 0 1 1;1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;1 1 1 1 1 0 0 0 1 1 1 1 1 1;1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0@tmgr您因为它们仍然应该返回2
。引用您的问题陈述:“该参数将不超过两个维度。”,我猜这意味着我不必检查是否有超过两个维度。
function i=classify(x)
[m, n]=size(x);
if n==1 && m==1
i=0;
elseif (m==0 && n==0)|| (m>=1 && n==0) || (m==0 && n>=1)
i=-1;
elseif (n>=1 && m==1) || (n==1 && m>=1)
i=1;
else i=2;
end
function y=classify(x)
[a b]=size(x);
%check for empty matrix
% Do not forget that an empty matrix can be size a x 0 or 0x a, where a can be
% arbitrary number
if (a>0)&&(b==0)||(a==0)&&(b>0)||(a==0)&&(b==0)
y=(-1);
%check for scalar
elseif (a==1)&&(b==1)
y=0;
%check for vector
elseif (a>=1)&&(b==1)||(a==1)&&(b>=1)
y=1;
%other case
else
y=2;
end