哪里错了啊

//思路:先比较对角线元素。找一个比他大一点比他小一点的。两个矩阵都不会存在这个数,从剩下的数字里面找
class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int diff[array[0].size()-1];
        for(int i=0;i<array[0].size();i++){
            diff[i]=target-array[i][i];
            if(diff[i] == 0){//找到了
                return true;}}
            //下面开始找diff中负数中最大的元素
        int max=diff[0];
        int minposition=0;
         for(int i=0;i<array[0].size();i++){
            if (diff[i]<0){
                    if (diff[i]>max){
                       minposition=i;
                        max=diff[i];
                    }
            }}
            //下面开始找diff中正数最小的元素
        int min=diff[array[0].size()-1];
        int maxposition=0;
        for(int i=0;i<array[0].size();i++)
        {if (diff[i]>0){
               
                    if (diff[i]<min){
                       maxposition=i;
                       min=diff[i];
                    }
                }
              }  

        //从剩下的两个矩阵里面遍历
        for (int m =0;m<minposition;m++){
            for(int n=maxposition;n<array[0].size();n++){
                if (array[m][n]==target)
                {return true;}
            }
        }   
        for (int n=maxposition;n<array[0].size();n++){
            for (int m =0;m<minposition;m++){
                if (array[n][m]==target)
                { return true;}
            }
        }
        return false;
    }
};

# 题目重述 你运行了一个 MATLAB 脚本(文件名为 `moni.m`),程序报: ``` 索引超过数组元素的数量。索引不能超过1。 出 moni (第124行) minx = min(v(:,1)) ``` 你希望知道:**这个误到底出在哪里?怎么改正?** --- 我们结合你提供的两个图片文件(`IMG_5841.JPG` 和 `IMG_5842.JPG`)中的代码和报信息,逐步分析。 --- # 代码解析 这是你的代码片段(来自图片): ```matlab v = 198:-1:99; % 1x100 row vector x1 = [v; v-1; v-2; v-3; v-4; v-5; v-6; v-7; v-8; v-9; v-10]; % 11x100 x2 = [x1; x1-11; x1-22; x1-33; x1-44; x1-55; x1-66; x1-77; x1-88]; % 99x100 v2 = 100:1:199; % 1x100 X = [x2; v2]; % 100x100 matrix % ... minx = min(v(:,1)); % ← 误发生在这一行(第124行) ``` --- ## 🔍 误定位:`minx = min(v(:,1))` ### ❌ 报原因: > **“索引超过数组元素的数量。索引不能超过1。”** 这意味着:你在访问 `v` 的第2行或更高行,但 `v` 只有 **1 个元素** 或 **只有1行且少于预期长度**。 但我们先确认一下 `v` 应该是什么: ```matlab v = 198:-1:99; ``` 我们来算一下它的长度: - 从 198 递减到 99,步长 -1 - 元素个数:$198 - 99 + 1 = 100$ - 所以 `v` 是一个 $1 \times 100$ 的 **行向量** ✅ 正常情况下,`v(:,1)` 是可以运行的,它等价于 `v(1,1)`,返回 `198`。 那为什么会报? --- ## 🚨 根本问题:`v` 被覆盖了! 关键线索来自你的工作区截图(`IMG_5842.JPG`): 在“工作区”中显示: - `v` 是一个 **1×100 double** —— 这是对的 - 但在命令行报时提示:“索引不能超过1” 这说明:**你在某个地方改变了 `v` 的值!** 再看你的代码是否有中间操作修改了 `v`? 虽然代码没写,但很可能你在调试过程中执行过类似: ```matlab v = min(x1); % 或其他操作 → 把 v 变成了标量! ``` 或者你在脚本中不小心写了: ```matlab v = something_scalar; ``` 导致原本的 $1\times100$ 向量被替换成一个数字。 📌 **一旦 `v` 变成标量(比如 `v = 100`),再执行 `v(:,1)` 就会出!** 因为: - `:` 表示“所有行” - 如果 `v` 是标量,它只有 `v(1,1)` - 但当你写 `v(:,1)`,MATLAB 试图取出“第1列的所有行”,而你并没有那么多行 → 报! --- ## ✅ 如何验证? 在命令行输入: ```matlab whos v ``` 看看 `v` 的大小是不是真的是 $1 \times 100$。 如果你看到: ``` Name Size Bytes Class v 1x1 8 double ``` 那就说明 `v` 已经被改成标量了! --- ## ✅ 正确写法(修复方案) ### ✅ 方案一:确保 `v` 不被覆盖 不要在后续代码中重新赋值 `v` 为标量。 如果你想保存最小值,用别的变量名: ```matlab minx = min(v); % 整个 v 的最小值 → 99 min_first_col = v(1); % 第一列的值 → 198 ``` ### ✅ 方案二:如果你想取 `v` 的第一个元素 ```matlab minx = v(1); % 推荐 % 或 minx = v(1,1); % 也可以 ``` 不需要用 `min(v(:,1))`,因为 `v(:,1)` 只有一个元素。 > ❌ `min(v(:,1))` 是多余的,还容易出! --- ## 🛠️ 改进建议 ```matlab % ---- 正确完整代码 ---- v = 198:-1:99; % 1x100 x1 = [v; v-1; v-2; v-3; v-4; v-5; v-6; v-7; v-8; v-9; v-10]; x2 = [x1; x1-11; x1-22; x1-33; x1-44; x1-55; x1-66; x1-77; x1-88]; v2 = 100:1:199; X = [x2; v2]; % 如果你想取 v 的最小值(即 99) minx = min(v); % ✅ 推荐 % 如果你想取 v 的第一列(即第一个元素 198) first_val = v(1); % ✅ 推荐 % 删除这句误代码: % minx = min(v(:,1)); % ❌ 多余且危险 ``` --- ## 📌 总结:哪儿了? | 项目 | 内容 | |------|------| | ❌ 误语句 | `minx = min(v(:,1))` | | 🧨 原因 | 虽然 `v` 原本是 $1 \times 100$,但你可能在中间把它改成了标量(如 `v=100`) | | 💥 后果 | `v(:,1)` 被解释为“第1列的所有行”,但 `v` 只有一个元素 → 索引越界 | | ✅ 正确做法 | 使用 `min(v)` 取最小值,或 `v(1)` 取第一个元素,避免复杂索引 | --- # 知识点 - **变量覆盖风险**:不要重复使用变量名(如 `v = min(...)`)破坏原有数据。 - **行向量索引**:$1 \times 100$ 向量不能用 `:` 引用多行,`v(:,1)` 易引发误解。 - **最小值正确取法**:对向量直接用 `min(v)`,无需多余索引。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值