【问题标题】:Accessing cells of a matrix to use in a for loop (MATLAB)访问矩阵的单元格以在 for 循环中使用 (MATLAB)
【发布时间】:2017-09-19 07:15:35
【问题描述】:

在使用 for 循环将我创建的矩阵中的值分配给某个变量时,我似乎遇到了问题。我正在使用不同的角度对来创建绘图,并且我想在 for 循环中访问这些元素以生成 Q1 和 Q2 的值。

代码:

L1=input('Enter the length of Link 1:' );
L2=input('Enter the length of Link 2:' );
i=0:5:180;
j=0:5:180;
[p,q] = meshgrid(i, j);
pairs = [p(:) q(:)];
for k = 1 : size(pairs)
Q1(k)=pairs(k,1);
Q2(k)=pairs(k,2);
PEx(k)=(L1.*cosd(Q1))+(cosd(Q1).*cosd(Q2).*L2);
PEy(k)=(L1.*sind(Q1))+(sind(Q1).*cosd(Q2).*L2);
PEz(k)=(-L2.*sind(Q2));
end

错误: “在赋值 A(:) = B 中,A 和 B 中的元素个数必须相同。”

谢谢

【问题讨论】:

  • 错误指的是哪一行?
  • 尝试使用matlab调试器更好地理解问题。我认为错误信息很清楚。其次,如果您创建minimal reproducible example,请避免要求用户输入,只需使用一些示例值。

标签: matlab loops for-loop matrix elements


【解决方案1】:

我认为您希望for k = 1:size(pairs,2) 获得pairs 中的 数,否则size 将返回[nrows ncols]

然后,当您分配给PEx 等时,您将使用整个Q1Q2 向量,而不是最近的元素。而是使用(例如)

PEz(k)=(-L2.*sind(Q2(k)));

那么你的代码就变成了:

L1=input('Enter the length of Link 1:' );
L2=input('Enter the length of Link 2:' );
i=0:5:180;
j=0:5:180;
[p,q] = meshgrid(i, j);
pairs = [p(:) q(:)];
for k = 1:size(pairs,2)
    Q1(k)=pairs(k,1);
    Q2(k)=pairs(k,2);
    PEx(k)=(L1.*cosd(Q1(k)))+(cosd(Q1(k)).*cosd(Q2(k)).*L2);
    PEy(k)=(L1.*sind(Q1(k)))+(sind(Q1(k)).*cosd(Q2(k)).*L2);
    PEz(k)=(-L2.*sind(Q2(k)));
end

但是,您可以通过矢量化代码来移除循环:

% Get inputs (you should probs have more validation checks here, maybe use 's' flag)
L1 = input('L1: '); L2 = input('L2: ');
% Set up pairs, avoid i and j as variable names, equal sqrt(-1) by default in MATLAB
ii = 0:5:180;
[p, q] = meshgrid(ii,ii);
% Skip assigning pairs, as it's just used as separate p and q anyway
Q1 = p(:); Q2 = q(:);
% Instead of looping just assign directly. You've already (correctly) used element-wise .*
PEx =(L1.*cosd(Q1))+(cosd(Q1).*cosd(Q2).*L2);
PEy = (L1.*sind(Q1))+(sind(Q1).*cosd(Q2).*L2);
PEz = (-L2.*sind(Q2));

【讨论】:

  • 我一直在写我的答案并看到了你的答案。你太快了! :D
【解决方案2】:

问题在于:

PEx(k)=(L1.*cosd(Q1))+(cosd(Q1).*cosd(Q2).*L2);

您正在将 1x2 分配给 1x1 变量。以下 PEyPEz 也会发生这种情况,因为您正在使用一对 cosdsind 并且输出已经是 1x2。

也许您必须重新考虑如何存储链接计算的结果,但错误就在那里。

【讨论】:

  • 冷静的哥们,我上传的时候没有看到你的“更彻底的回答”
  • 所以我应该删除这个吗?我总是看到人们在不同的规范级别得到答案的帖子。我的意思是,我只是注意到他的代码失败的原因,并给了他我认为的建议。相反,您给了他一个解决方案,告诉他对他的代码进行矢量化,这非常完美,更高效,但不要给他任何空间让他通过自己的代码学习。
  • 很好,对此有其他用户输入很好,我会改变回答问题的方式,并尝试接近您使用的模型,这是有道理的。抱歉,如果我对您的第一条评论进行了辩护,考虑到我与其他用户的最后经历,这对我来说听起来有点粗鲁
  • 不用担心,当您的代表人数较低时,提供答案而不是 cmets 很容易,因为您有机会获得支持,但可以想象答案对未来的网站会有多大用处不是 OP 的访问者,那么就有更多以解决方案为导向的动机。我已经在这篇文章中清理了我的 cmets 以保持主题。
猜你喜欢
  • 2018-10-14
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多