Matlab新手求助:引用传递参数及矩阵组合积和计算问题
解决Matlab递归结果传递问题,附更高效的数学解法
嘿,作为Matlab新手碰到递归里的变量传递问题太正常了!你的代码核心问题是没正确处理累加变量D的传递,全局变量失效大概率是因为没在所有用到它的地方声明。下面给你几个靠谱的解决方案,还有一个能直接绕开递归的高效技巧:
方法1:用嵌套函数(最推荐,不用全局变量也不麻烦)
嵌套函数可以直接访问外层函数的变量,完美解决递归里的累加问题。我们把递归逻辑包在一个外层函数里,外层初始化D,递归函数直接修改它就行:
function D = calculateCombinationSum(x) D = 0; % 初始化结果变量 [rowCount, ~] = size(x); % 获取矩阵的行数 combination(rowCount, []); % 启动递归 % 嵌套的递归子函数 function combination(n, currentCombo) if n == 0 D = D + prod(currentCombo); % 直接更新外层的D else % 遍历当前行的所有列(这里改成size(x,2)更通用,不用固定3列) for colIdx = 1:size(x,2) newCombo = [currentCombo, x(n, colIdx)]; combination(n-1, newCombo); % 这里不用手动回溯数组,因为我们传的是新数组newCombo,原currentCombo不会变 end end end end
调用的时候直接传矩阵就行:
x = [1 2 3; 4 5 6]; result = calculateCombinationSum(x); % 输出就是你要的90
方法2:让递归函数返回累加结果
如果不想用嵌套函数,可以修改递归函数,让它每次返回当前分支的累加值,然后上层函数把这些值加起来:
function total = combination(n, currentCombo, x) total = 0; if n == 0 total = prod(currentCombo); else for colIdx = 1:size(x,2) newCombo = [currentCombo, x(n, colIdx)]; total = total + combination(n-1, newCombo, x); % 累加递归返回的结果 end end end
调用方式:
x = [1 2 3; 4 5 6]; [rowCount, ~] = size(x); result = combination(rowCount, [], x);
方法3:用全局变量(不推荐,容易踩坑)
要是你非要试全局变量,必须在所有用到D的地方都声明global D,包括调用它的脚本或者命令行:
function combination(n,A,x) global D; % 声明全局变量 if n == 0 D = D + prod(A); else for i = 1:size(x,2) A = [A x(n,i)]; combination(n-1,A,x); if length(A)>=1 A = A(1:length(A)-1); end end end end
调用前一定要先初始化:
global D; D = 0; x = [1 2 3; 4 5 6]; combination(2, [], x); % 这时候D就是你要的结果90
划重点:用数学公式直接搞定,不用递归!
其实你要算的结果有个更简单的数学规律:所有不同行选元素的组合乘积之和,等于矩阵每行元素和的乘积(乘法分配律嘛,展开就是所有组合的乘积相加)。用Matlab一行代码就能解决:
x = [1 2 3; 4 5 6]; result = prod(sum(x, 2)); % sum(x,2)算出每行的和:[6;15],prod乘起来就是6×15=90
这个方法比递归高效太多了,尤其是矩阵规模大的时候,递归容易栈溢出或者慢得离谱,这个方法是O(m)的时间复杂度,m是行数,绝对靠谱。
内容的提问来源于stack exchange,提问作者Gomeisa
相关产品推荐
相关产品推荐

