Matlab 为什么我的函数只返回一个值而返回两个值?
所以我尝试在Matlab中实现辛普森方法,这是我的代码:Matlab 为什么我的函数只返回一个值而返回两个值?,matlab,matrix,Matlab,Matrix,所以我尝试在Matlab中实现辛普森方法,这是我的代码: function q = simpson(x,f) n = size(x); %subtracting the last value of the x vector with the first one ba = x(n) - x(1); %adding all the values of the f vector which are in even places starting from f(2) a = 2*f(2:2:end-1
function q = simpson(x,f)
n = size(x);
%subtracting the last value of the x vector with the first one
ba = x(n) - x(1);
%adding all the values of the f vector which are in even places starting from f(2)
a = 2*f(2:2:end-1);
%adding all the values of the f vector which are in odd places starting from 1
b = 4*f(1:2:end-1);
%the result is the Simpson approximation of the values given
q = ((ba)/3*n)*(f(1) + f(n) + a + b);
这就是我得到的错误:
Error using ==> mtimes
Inner matrix dimensions must agree.
出于某种原因,即使我将q设为
q = f(n)
q = f(1)
因此,我得到:
q =
0 1
而不是
q =
0
当我把q设为
q = f(n)
q = f(1)
我得到:
q =
0
q =
0
我无法解释这种行为,这可能就是我得到上述错误的原因。那么为什么q有两个值而不是一个
编辑:x=linspace(0,pi/2,12);
f=sin(x)
size(x)
返回数组的大小。这将是一个包含矩阵所有维度的向量必须至少有两个维度
在您的例子中,n=size(x)
将给出n=[n,1],而不仅仅是您想要的数组长度。这意味着ba将有2个元素
您可以使用返回最长维度而不是大小的length(x)
(或numel(x)
或size(x,1)
或2,这取决于仅返回编号维度的x的定义方式)
另外,你想在a和b中求和,而现在你只需要用这些元素创建一个向量。尝试将其更改为a=2*sum(f(…)
,类似于b
发生错误的原因是,您正在对两个维度不同的向量进行矩阵乘法,这是不允许的。如果您更改代码,那么所有的值都应该是标量,这样它就可以工作了
为了得到正确答案(3*n),也应该在括号中,因为matlab不喜欢在/和*()之间。您的版本有(ba/3)*n,这是错误的。size(x)
返回数组的大小。这将是一个包含矩阵所有维度的向量必须至少有两个维度
在您的例子中,n=size(x)
将给出n=[n,1],而不仅仅是您想要的数组长度。这意味着ba将有2个元素
您可以使用返回最长维度而不是大小的length(x)
(或numel(x)
或size(x,1)
或2,这取决于仅返回编号维度的x的定义方式)
另外,你想在a和b中求和,而现在你只需要用这些元素创建一个向量。尝试将其更改为a=2*sum(f(…)
,类似于b
发生错误的原因是,您正在对两个维度不同的向量进行矩阵乘法,这是不允许的。如果您更改代码,那么所有的值都应该是标量,这样它就可以工作了
为了得到正确答案(3*n),也应该在括号中,因为matlab不喜欢在/和*()之间。您的版本有(ba/3)*n,这是错误的。size(x)
返回数组的大小。这将是一个包含矩阵所有维度的向量必须至少有两个维度
在您的例子中,n=size(x)
将给出n=[n,1],而不仅仅是您想要的数组长度。这意味着ba将有2个元素
您可以使用返回最长维度而不是大小的length(x)
(或numel(x)
或size(x,1)
或2,这取决于仅返回编号维度的x的定义方式)
另外,你想在a和b中求和,而现在你只需要用这些元素创建一个向量。尝试将其更改为a=2*sum(f(…)
,类似于b
发生错误的原因是,您正在对两个维度不同的向量进行矩阵乘法,这是不允许的。如果您更改代码,那么所有的值都应该是标量,这样它就可以工作了
为了得到正确答案(3*n),也应该在括号中,因为matlab不喜欢在/和*()之间。您的版本有(ba/3)*n,这是错误的。size(x)
返回数组的大小。这将是一个包含矩阵所有维度的向量必须至少有两个维度
在您的例子中,n=size(x)
将给出n=[n,1],而不仅仅是您想要的数组长度。这意味着ba将有2个元素
您可以使用返回最长维度而不是大小的length(x)
(或numel(x)
或size(x,1)
或2,这取决于仅返回编号维度的x的定义方式)
另外,你想在a和b中求和,而现在你只需要用这些元素创建一个向量。尝试将其更改为a=2*sum(f(…)
,类似于b
发生错误的原因是,您正在对两个维度不同的向量进行矩阵乘法,这是不允许的。如果您更改代码,那么所有的值都应该是标量,这样它就可以工作了
为了得到正确答案(3*n),也应该在括号中,因为matlab不喜欢在/和*()之间。你的版本有(ba/3)*n,这是错误的。这个f变量是什么?你得到的是哪一行的错误?你甚至还没有展示f到底是什么。你得到的结果是基于你的
f
I编辑了我的帖子并添加了我的x和f。我在试图计算q的那一行中得到了错误。因此我将a
和b
更改为a=sum(f(2:2:end-1));b=总和(4*f(1:2:end-1))代码>和测试运行后a=3.0133
和b=13.9103
,但我在尝试计算q时仍然得到相同的错误。也许f是个问题。如何访问f的第一个和最后一个值而不弄乱它?尝试将行n=size(x)
更改为n=size(x,1)
。当我将其更改为n=size(x,1)
时,我得到q=0
,因为size(x,1)
的结果是1
我将其更改为n=size(x,2)
我得到了n=12
,它的大小是x
。现在我得到q=112.6176
。这个f变量是什么?你得到的是哪一行的错误?你甚至还没有展示f到底是什么