You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:27:53