如何将FOR循环中的所有迭代结果输出到矩阵中并绘制图形

时间:2013-02-07 03:36:50

标签: matlab

我有两个嵌套格式的for循环。我的第二个循环计算最终的等式。结果的显示在第二个循环之外,以便在第二个循环完成时显示。

以下是我在MATLAB中使用的逻辑。我需要绘制eqn2 vs x的图表。

L=100
for x=1:10
    eqn1
       for y=1:L
          eqn2
       end 
       value = num2strn eqn2
       disp value
end

目前我遇到的问题是eqn2的值或输出总是在每个周期后被替换,直到x达到10.因此,eqn2的工作空间表和值仅显示最后一个值。我的目的是在1:10的x的每个循环中记录value的所有输出值。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

你根据我的口味进行了伪编码 - 我试图重建你想要做的事情。如果我理解正确,这应该解决你的问题(存储数组Z中计算的中间结果):

L=100
z = zeros(L,10);
for x=1:10
   % perform some calculations
   eqn1
   for y=1:L
   % perform some more calculations; it is not clear whether the result of 
   % this loop over y=1:L yields one value, or L. I am going to assume L values
       z(y, x) = eqn2(x, y)
   end 

   value =num2strn eqn2

   disp value
end

% now you have the value of each evaluation of the innermost loop available. You can plot it as follows:

figure; 
plot( x, z); % multiple plots with a common x parameter; may need to use Z' (transpose)...
title 'this is my plot'; 
xlabel 'this is the x axis'; 
ylabel 'this is the y axis';

至于您在评论中提出的其他问题,您可能会在以下内容中找到灵感:

L = 100;
nx = 20; ny = 99;  % I am choosing how many x and y values to test
Z = zeros(ny, nx); % allocate space for the results
x = linspace(0, 10, nx); % x and y don't need to be integers
y = linspace(1, L, ny);
myFlag = 0;              % flag can be used for breaking out of both loops

for xi = 1:nx            % xi and yi are integers
    for yi = 1:ny
         % evaluate "some function" of x(xi) and y(yi)
         % note that these are not constrained to be integers
         Z(yi, xi) = (x(xi)-4).^2 + 3*(y(yi)-5).^2+2;

         % the break condition you were asking for
         if Z(yi, xi) < 5
             fprintf(1, 'Z less than 5 with x=%.1f and y=%.1f\n', x(xi), y(yi));
             myFlag = 1; % set flag so we break out of both loops
             break
         end
    end
    if myFlag==1, break; end % break out of the outer loop as well
end

这可能不是你想到的 - 我无法理解“运行循环直到z(y,x)&lt; 5的所有值然后它应该输出x”。如果你运行外循环完成(这是你知道“z(y,x)的所有值的唯一方法”那么你的x值将是它的最后一个值...这就是我建议运行的原因x和y的所有值,收集整个矩阵Z,然后检查Z以获得所需的东西。

例如,如果您想知道是否存在X的值,其中所有Z&lt; 5,你可以这样做(如果你没有突破for循环):

highestZ = max(Z, [], 1); % "take the highest value of Z in the 1 dimension
fprintf(1, 'Z is always < 5 for x = %d\n', x(highestZ<5));

如果你无法从这里弄清楚,我放弃......