如何从循环中存储两个变量(x.y)?

时间:2019-05-15 10:26:36

标签: matlab psychtoolbox

我正在循环内生成两个不同的坐标(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,变量)。

2 个答案:

答案 0 :(得分:1)

听力是有效的代码:

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);,它只是建议分配内存以提高速度,而不是少数元素的问题。

答案 1 :(得分:1)

这很难理解,哪个错误消息来自哪个尝试,但是让我们看一下。

我没有访问 Parallel Computing Toolbox 的权限,使用for-loop over distributed range drange似乎是必需的,但是我认为,可以用for i = 0:setsize代替此循环测试。

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

要存储所有9对xy,您的circleposition应该是一个9 x 2数组,因此,可以使用circleposition = zeros(setsize, 2)进行初始化

最后,您需要使用适当的索引将[x, y]存储在i的第circleposition行的第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时出错。被连接的矩阵的尺寸不一致。):我看不到,您在哪里使用了垂直连接! / p>