MATLAB - 从 for 循环中生成 table
MATLAB - Make table from for loop
我有以下代码
x=[1 0.5 0.5]', iter=0; dxnorm=1;
while dxnorm>0.5e-4 & iter<10
f=[cos(x(1))+cos(x(2))+cos(x(3))-2
sin(x(1))+sin(x(2))+sin(x(3))
tan(x(1))-2.*tan(x(2))+tan(x(3))
] ;
J=[-sin(x(1)) -sin(x(2)) -sin(x(3))
cos(x(1)) cos(x(2)) cos(x(3))
tan(x(1)).^2 + 1 -2*tan(x(2)).^2 - 2 tan(x(3)).^2 + 1];
dx=-J\f;
x=x+dx;
dxnorm = norm(dx,inf), iter=iter+1;
end
x, iter
并且我想将每次迭代后的结果存储在 table 中,这样我就可以看到结果如何随着时间的推移而变化。我已经看到了一些关于如何执行此操作的不同代码(也就是说,你有一个 for 循环,并将每个结果存储在 table 中)但是我已经能够实现 none。任何想法我怎么能做到这一点?例如,我确实看过这里的一些示例,http://www.mathworks.com/matlabcentral/answers/163572-creating-a-table-of-values-from-for-loops,但正如我所说,我无法实现其中任何一个。
您需要使用迭代器来存储循环的每次迭代期间的结果。例如,如果您想保存 x
和 dxnorm
,您可以将它们存储在 cell array 的列中,而不用担心它们大小不同。
x = [1 0.5 0.5]';
maxiter = 10;
iter = 0;
dxnorm = 1;
results = cell(maxiter + 1, 2); % Preallocate results array
while dxnorm > 0.5e-4 && iter <= maxiter
f = [cos(x(1)) + cos(x(2)) + cos(x(3))-2; ...
sin(x(1)) + sin(x(2)) + sin(x(3)); ...
tan(x(1)) - 2.*tan(x(2)) + tan(x(3)); ...
];
J = [-sin(x(1)), -sin(x(2)), -sin(x(3)); ...
cos(x(1)), cos(x(2)), cos(x(3)); ...
tan(x(1)).^2 + 1, -2*tan(x(2)).^2 - 2, tan(x(3)).^2 + 1 ...
];
dx = -J\f;
results{iter + 1, 1} = x;
x = x + dx;
dxnorm = norm(dx,inf);
results{iter + 1, 2} = dxnorm;
iter = iter + 1;
end
这将为您提供一个元胞数组 results
,其中第一列包含您的 x
数据,第二列包含每个循环迭代的 dxnorm
数据。您索引到元胞数组 using curly braces {}
的元胞中,例如results{1, 1}
为您提供用于循环第一次迭代的 x
数据。
我有以下代码
x=[1 0.5 0.5]', iter=0; dxnorm=1;
while dxnorm>0.5e-4 & iter<10
f=[cos(x(1))+cos(x(2))+cos(x(3))-2
sin(x(1))+sin(x(2))+sin(x(3))
tan(x(1))-2.*tan(x(2))+tan(x(3))
] ;
J=[-sin(x(1)) -sin(x(2)) -sin(x(3))
cos(x(1)) cos(x(2)) cos(x(3))
tan(x(1)).^2 + 1 -2*tan(x(2)).^2 - 2 tan(x(3)).^2 + 1];
dx=-J\f;
x=x+dx;
dxnorm = norm(dx,inf), iter=iter+1;
end
x, iter
并且我想将每次迭代后的结果存储在 table 中,这样我就可以看到结果如何随着时间的推移而变化。我已经看到了一些关于如何执行此操作的不同代码(也就是说,你有一个 for 循环,并将每个结果存储在 table 中)但是我已经能够实现 none。任何想法我怎么能做到这一点?例如,我确实看过这里的一些示例,http://www.mathworks.com/matlabcentral/answers/163572-creating-a-table-of-values-from-for-loops,但正如我所说,我无法实现其中任何一个。
您需要使用迭代器来存储循环的每次迭代期间的结果。例如,如果您想保存 x
和 dxnorm
,您可以将它们存储在 cell array 的列中,而不用担心它们大小不同。
x = [1 0.5 0.5]';
maxiter = 10;
iter = 0;
dxnorm = 1;
results = cell(maxiter + 1, 2); % Preallocate results array
while dxnorm > 0.5e-4 && iter <= maxiter
f = [cos(x(1)) + cos(x(2)) + cos(x(3))-2; ...
sin(x(1)) + sin(x(2)) + sin(x(3)); ...
tan(x(1)) - 2.*tan(x(2)) + tan(x(3)); ...
];
J = [-sin(x(1)), -sin(x(2)), -sin(x(3)); ...
cos(x(1)), cos(x(2)), cos(x(3)); ...
tan(x(1)).^2 + 1, -2*tan(x(2)).^2 - 2, tan(x(3)).^2 + 1 ...
];
dx = -J\f;
results{iter + 1, 1} = x;
x = x + dx;
dxnorm = norm(dx,inf);
results{iter + 1, 2} = dxnorm;
iter = iter + 1;
end
这将为您提供一个元胞数组 results
,其中第一列包含您的 x
数据,第二列包含每个循环迭代的 dxnorm
数据。您索引到元胞数组 using curly braces {}
的元胞中,例如results{1, 1}
为您提供用于循环第一次迭代的 x
数据。