我注意到我正在尝试编写的函数非常奇怪。我的代码如下:
function y=testfun(x)
for i=1:2
A(i*ones(2,2))=eye(2,2);
y=zeros(2,2);
y=y+eye(2,2); %+A(1*ones(2,2))
end
end
如果我使用y=y+eyes(2,2)
,那么我会得到testfun(some random number)=[1 0; 0 1]
。但是,如果我删除y=y+eyes(2,2)
并输入y=y+A(1*ones(2,2)), testfun(some random number) = [1 1; 1 1]
。但是,我希望能得到和以前一样的答案,[1 0; 0 1]。
有没有人有可能知道为什么会这样?我的另一个问题是:如果我在命令窗口中键入A(1*ones(2,2))
,为什么我得到错误:“未定义函数'A'用于'double'类型的输入参数。”< / em>我没定义它吗?
感谢您的帮助!
答案 0 :(得分:0)
第一件事:Matlab在column-major order中存储元素。所以在第一次迭代中(当i
等于1
时),行
A(i*ones(2,2)) = eye(2,2);
按以下顺序等同于以下语句:
A(i) = 1;
A(i) = 0;
A(i) = 0;
A(i) = 1;
当然只有最后一个声明才有效。因此,在第一次迭代中,A
只是1
。出于同样的原因,在第二次迭代中(当i
等于2
时)A(2)
被分配了1
,因此A
变为[1 1]
。
函数返回的y
的值是第二次迭代的值。在该迭代中,请考虑语句
y = y + A(1*ones(2,2));
由于1*ones(2,2)
只有四个1
,因此表达式A(1*ones(2,2))
是一个包含四个1
的矩阵,即ones(2,2)
。您要将其添加到y
的上一个值zeros(2,2)
。因此y
变为ones(2,2)
,该值将由函数返回。