为何Symbolics.expand在Julia符号矩阵中无法正常生效?
问题分析与解决
问题根源
你的tidyMatrix!函数循环写法存在错误:
for i in size(M, 1), j in size(M, 2)
这里size(M,1)返回的是矩阵的行数(比如2x2矩阵就是2),i in size(M,1)只会让i取到行数这个单一数值,而非从1到行数的完整索引范围。同理j也是如此。这导致函数实际上只处理了矩阵的右下角元素(M[2,2]),其他元素根本没执行expand操作,自然无法和M2的展开形式匹配。
而在1x1的单元素矩阵中,size(M,1)和size(M,2)都是1,i和j刚好取到唯一的索引1,所以expand能正常处理目标元素,因此isequal返回true。
修复后的代码
将循环改为遍历完整的索引范围即可:
using Symbolics # 修正后的函数:遍历所有矩阵元素索引 function tidyMatrix!(M) for i in 1:size(M, 1), j in 1:size(M, 2) M[i,j] = expand(M[i,j]) end end @variables x M1 = [2(exp(x) + 1) 0; 0 0] M2 = [2*exp(x)+2 0; 0 0] tidyMatrix!(M1) tidyMatrix!(M2) println("Symbolic isequal: ", Symbolics.isequal(M1, M2)) # 现在返回true
额外验证
你可以在原错误函数中添加打印语句,确认实际处理的索引:
function tidyMatrix!(M) for i in size(M, 1), j in size(M, 2) println("Processing index: ($i, $j)") M[i,j] = expand(M[i,j]) end end
运行后会发现仅打印Processing index: (2, 2),直接验证了之前的结论。
内容的提问来源于stack exchange,提问作者haifisch123
相关产品推荐
相关产品推荐

