【问题标题】:How to store two variables (x.y) from a loop?如何从循环中存储两个变量(x.y)?
【发布时间】:2019-05-15 10:26:36
【问题描述】:

我在一个循环中生成两个不同的坐标(x, y)。在我的代码中,我刚刚意识到它正在保存循环中的最后一个变量。但是,我正在尝试保存 setsize 变量中的所有迭代。我已经尝试使用类似的方式保存:

circleposition = [0:length(setsize) x(i),y(i)]; 

但是,我似乎没有正确执行,收到以下错误:

Subscript indices must either be real positive integers or logicals.- 
Error using vertcat
Dimensions of matrices being concatenated are not consistent.

这是我的原始代码:

setsize = 9; 
r = 340;
cx = 500;
cy = 500;
anglesegment = 2 * pi/setsize;
circleposition = []; 

for i = drange (0:setsize)
    x = r * cos(i*anglesegment) + cx;
    y = r * sin(i*anglesegment) + cy;
    circleposition = [x,y];
end 

输出:

circleposition =
             0    1.0000
      840.0000  500.0000

它仅在第一次/最后一次迭代时运行。我需要得到 9 个x 和 9 个y(取决于 setsize,变量)。

【问题讨论】:

    标签: matlab psychtoolbox


    【解决方案1】:

    有点难以理解,哪个错误消息来自哪个尝试,但让我们看看。

    我无法访问 Parallel Computing Toolbox,这似乎是使用 for-loop over distributed range drange 所必需的,但我认为,此循环可以替换为 for i = 0:setsize 进行测试。 p>

    现在,当从i = 0 开始时,您将尝试访问x(0)y(0),这是不允许的(下标索引必须是正整数或逻辑数)。此外,正如您在问题中所述,您将获得 10 个值而不是 9 个值。所以,让我们从i = 1开始吧。

    要存储所有 9 对 xy,您的 circleposition 应该是一个 9 x 2 数组因此,将其初始化为例如 circleposition = zeros(setsize, 2)

    最后,您需要使用适当的索引来将[x, y] 存储在circlepositioni-th 行,即circleposition(i, :)

    因此,更正后的代码(注意替换的 drange 部分)可能如下所示:

    setsize = 9; 
    r = 340;
    cx = 500;
    cy = 500;
    anglesegment = 2 * pi/setsize;
    circleposition = zeros(setsize, 2);     % Initialize circleposition appropriately
    
    for i = 1:setsize                       % Start at i = 1
        x = r * cos(i*anglesegment) + cx;
        y = r * sin(i*anglesegment) + cy;
        circleposition(i, :) = [x, y];      % Correct indexing of the row
    end 
    
    circleposition                          % Output
    

    然后输出将是:

    circleposition =
       760.46   718.55
       559.04   834.83
       330.00   794.45
       180.50   616.29
       180.50   383.71
       330.00   205.55
       559.04   165.17
       760.46   281.45
       840.00   500.00
    

    关于第二个错误(错误使用vertcat。被连接的矩阵的尺寸不一致。):我看不出,你在哪里使用了垂直连接!?

    【讨论】:

      【解决方案2】:

      听到的是有效的代码:

      setsize = 9; 
      r = 340;
      cx = 500;
      cy = 500;
      anglesegment = 2 * pi/setsize;
      circleposition = zeros(setsize + 1, 2); % Changed from circleposition = []
      
      for i = drange (0:setsize)
          x = r * cos(i*anglesegment) + cx;
          y = r * sin(i*anglesegment) + cy;
          circleposition((i+1),:) = [x,y]; % Changed from circleposition = [x,y];
      end
      

      说明:

      修复方法是将circleposition = [x,y]; 更改为circleposition((i+1),:) = [x,y]。没有((i+1),:),你是在更改circleposition的数据,而不是添加。

      不需要将circleposition = []; 更改为circleposition = zeros(setsize + 1, 2);,它只是建议分配内存以提高速度,而不是少量元素的问题。

      【讨论】:

      • 最好也解释一下为什么 OP 代码不起作用(它有什么问题)。
      猜你喜欢
      • 1970-01-01
      • 2017-07-05
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多