2014-10-19 244 views
-2

我在MATLAB函数上做了一些功课。 任务是制作一个函数acc=accvec(m,rv,rl),其计算如下:
Matlab - 尺寸不匹配

其中m是3x1阵列,rv是3x3x3阵列而rl是3x3阵列。我的解决方案如下:

function acc=accvec(m,rv,rl) 
% calculate the acceleration of the object 
s=size(rv); 
acc=zeros(s(1),s(2)); 

global G 

for i=1:s(2) 
    for j=1:s(2) 
     if i ~= j 
      for k=1:3 
       acc(k,i)=acc(k,i)-G*m(j)*rl(i,j)./rv(k,i,j)^3; 
      end 
     end 
    end 
end 

这里是一个link到包含使用的所有功能的RAR文件。如果你给rvr=[1 0 0; 0 1 0; 0 0 1]rl与新鲜计算rvm=[1 2 3]G=1;的结果应该是

acc = 
-1.7678 0.3536 0.3536 
0.7071 -1.4142 0.7071 
1.0607 1.0607 -1.0607 

但我的功能ac抛出一个尺寸不匹配,我只是想不通,为什么和我需要其他人看着它并去哦这很简单。

回答

0

此代码不工作的原因是因为G尚未初始化,即使您已将其设置为global。参照documentation on global,仅在特定程序的生命周期中变量为global。另外,如果变量为global,则在执行的脚本生命周期内的所有功能都将能够看到此变量。

即使您在调用之前可能已将其设置为您的函数之外的某个东西,但G实际上并未设置为任何值。请记住,当在MATLAB中调用函数时,所声明的变量仅在该函数的范围内定义,因此您在执行函数之前设置的任何值都将不可见。因此,您需要在脚本中自行设置此变量。

如果您手动更改G以使其设置为1(根据您的帖子),那么您将能够得到答案。因此,请改为:

G = 1; 

您的程序现在应该运行。我其实只是做了一个随机数据测试,它输出一个3 x 3的矩阵。但是,您正在计算的公式的准确性我没有检查过,所以我将把这些作为练习留给您。祝你好运!

+0

哦,没错。现在运行。我只是发现了错误(我翻了rv和rl)。所以现在它会产生正确的结果。谢谢。全局变量的原因是我们假设G被定义为检查我们的代码的网站中的全局变量。我的错。非常感谢! – SiGF 2014-10-19 17:26:51