MATLAB简化台球移动顺序判断代码指导请求
MATLAB新手优化台球移动排序代码指导需求
我正在写一个MATLAB函数,输入3个台球的x、y坐标数组,要输出它们的移动先后顺序,还有总共移动的球数。现在用一堆if-else写出来,代码太乱了,我不需要直接能复制的解决方案,就想知道针对新手的优化方向。
我的代码片段如下:
function [FirstBall,SecondBall,LastBall, NbBallsMoved] = GetBallMoveOrder(Xr, Yr, Xy, Yy, Xw, Yw, MoveDistPx) [Idx_r,len_r] = GetFirstMoveIdx(Xr,Yr,MoveDistPx); [Idx_y,len_y] = GetFirstMoveIdx(Xy,Yy,MoveDistPx); [Idx_w,len_w] = GetFirstMoveIdx(Xw,Yw,MoveDistPx); if Idx_r < Idx_y && Idx_r < Idx_w % 红球先移动的情况 FirstBall = 1; if Idx_y < Idx_w SecondBall = 2; LastBall = 3; elseif Idx_y > Idx_w SecondBall = 3; Lastball = 2; elseif len_y > len_w SecondBall = 2; LastBall = 3; elseif len_y < len_w SecondBall = 3; LastBall = 2; else SecondBall = 2; LastBall = 3; end end end
注:Xr/Yr、Xy/Yy、Xw/Yw分别是三个台球的坐标数组,GetFirstMoveIdx函数会返回该台球首次移动的索引(Idx_*)和移动的像素长度(len_*)。我试过用sort函数,但不知道怎么把排序后的值和对应的台球对应起来,没成功。
给MATLAB新手的优化方向
1. 把每个球的信息打包在一起,避免关联丢失
你之前用单独变量存每个球的Idx、len和编号,排序时容易脱节。可以把每个球的关键信息放在一个矩阵或者结构体里:
- 用矩阵的话,每一行对应一个球,列分别是
Idx、len、球的编号(1=红球,2=黄球,3=白球):ballInfo = [Idx_r, len_r, 1; Idx_y, len_y, 2; Idx_w, len_w, 3]; - 用结构体数组更直观,新手也容易理解:
balls(1).firstMoveIdx = Idx_r; balls(1).moveLen = len_r; balls(1).id = 1; % 红球编号 balls(2).firstMoveIdx = Idx_y; balls(2).moveLen = len_y; balls(2).id = 2; % 黄球编号 balls(3).firstMoveIdx = Idx_w; balls(3).moveLen = len_w; balls(3).id = 3; % 白球编号
2. 用MATLAB自带的排序函数实现多条件排序
你的排序逻辑是先比Idx(越小越先动),Idx相同的话比len(越大越先动)。不用写一堆if-else,用sortrows就能搞定:
- 针对上面的
ballInfo矩阵,sortrows可以指定排序的列和顺序。因为要让len降序,我们可以把len取负数,这样升序排序负数就相当于原数的降序:
执行完这行,sortedBalls = sortrows(ballInfo, [1, -2]);sortedBalls的第一行就是第一个移动的球,第二行第二个,第三行第三个,第三列就是对应的球编号。
3. 直接从排序后的结果里提取顺序
排序完之后,不用再判断,直接取对应位置的编号就行:
FirstBall = sortedBalls(1, 3); SecondBall = sortedBalls(2, 3); LastBall = sortedBalls(3, 3);
如果用结构体数组,排序后可以通过循环或者索引提取每个球的id字段。
4. 统计总移动球数
总移动球数就是有多少个球确实发生了移动,你可以根据GetFirstMoveIdx的返回值判断(比如未移动的球Idx是无穷大或者某个特定值),用sum函数统计:
% 假设未移动的球Idx是inf,根据你的实际情况调整判断条件 NbBallsMoved = sum(~isinf([Idx_r, Idx_y, Idx_w]));
内容的提问来源于stack exchange,提问作者yocut
相关产品推荐
相关产品推荐

