ML课后练习问题:fmincg: nonconformant arguments

Andrew Ng的公开课练习ex3,遇到如下问题:
error: fmincg: operator +: nonconformant arguments (op1 is 401*10, op2 is 4010*1)。

fmincg进行“+”操作运算时,参数的维度冲突。

原因是:写lr CostFunction的时候出错,导致矩阵维度不匹配。
在oneVsAll文件里面,针对每个分类器,依次做模型训练,用fmincg使costFunction最小,得到每个分类器的最优theta。合并theta,得到all_theta。

在 Octave 或 MATLAB 中出现 `operator /: nonconformant arguments (op1 is 1x1, op2 is 1x130321)` 错误,表示尝试对两个维度不兼容的矩阵执行除法操作。MATLAB 和 Octave 中的 `/` 运算符用于矩阵右除,其要求操作数满足矩阵除法的维度兼容性规则。 ### 错误原因 - `op1` 是 `1x1` 的标量或单元素矩阵。 - `op2` 是 `1x130321` 的行向量。 - 尝试使用 `/` 运算符将标量除以行向量,这在矩阵代数中是没有定义的。 ### 解决方法 #### 1. 明确运算意图 如果目标是将标量除以向量中的每个元素,应使用数组右除运算符 `./` 而不是矩阵右除运算符 `/`。数组除法对两个操作数的大小要求是它们必须具有兼容的维度(通常为相同大小或其中一个为标量)。 ```matlab result = scalar_value ./ vector; % 使用数组除法,标量自动扩展为与vector同长的向量 ``` #### 2. 检查变量维度 确保变量的维度符合预期。例如,`scalar_value` 是否确实是标量,`vector` 是否是预期的 `1xN` 向量。可以使用 `size()` 或 `whos` 查看变量维度。 ```matlab disp(size(scalar_value)); % 应显示 [1, 1] disp(size(vector)); % 应显示 [1, N] ``` #### 3. 调试函数输入 如果该运算出现在函数内部,检查函数调用时传入的参数是否正确。例如,是否将本应为向量的参数错误地传入了标量,或反之。 #### 4. 避免隐式扩展错误 在较新版本的 MATLAB 中(R2016b 及以后),支持隐式扩展(Implicit Expansion),即标量与向量之间的数组运算会自动扩展标量。但在旧版本中可能需要显式扩展标量,例如使用 `repmat()`。 ```matlab scalar_value = 5; vector = 1:130321; result = repmat(scalar_value, size(vector)) ./ vector; % 显式扩展标量 ``` #### 5. 使用 `mrdivide` 函数进行矩阵右除 如果确实需要执行矩阵右除(如求解线性方程组 `X = A/B`),则确保 `A` 和 `B` 的列数相同。例如: ```matlab X = A / B; % 等价于 X = A * inv(B),其中 B 必须为方阵 ``` 但该情况不适用于当前错误描述中的 `1x1` 和 `1x130321` 的组合。 ### 示例代码 ```matlab % 正确用法:数组除法 scalar_value = 5; vector = 1:130321; result = scalar_value ./ vector; % 每个元素被标量除 ``` ### 总结 该错误的核心问题是矩阵除法操作数的维度不匹配。解决的关键在于明确运算意图(矩阵除法 vs 数组除法),并确保操作数维度兼容。若意图是标量与向量的逐元素除法,则应使用 `./` 运算符 [^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值