我相信MATLAB中的大多数函数都应该能够接收矩阵输入并以矩阵的形式返回输出。
例如sqrt([1 4 9])将返回[1 2 3]。
但是,当我尝试这种重复的因子函数时:
function k = fact(z)
if z ~= 0
k = z * fact(z-1);
else
k = 1;
end
end
当一个数字被输入事实时它完美地工作。但是,当矩阵输入事实时,它返回矩阵本身,而不执行阶乘函数。
E.g。
事实(3)返回6 事实([1 2 3])返回[1 2 3]而不是[1 2 6]。
感谢任何帮助。非常感谢你!
答案 0 :(得分:2)
由于MATLAB不熟悉递归函数,因此矢量化方法如何?试试这个矢量输入 -
mat1 = repmat([1:max(z)],[numel(z) 1])
mat1(bsxfun(@gt,1:max(z),z'))=1
output1 = prod(mat1,2)
示例运行 -
z =
1 2 7
output1 =
1
2
5040
为了回答你原来的问题,这里是矢量或2D矩阵作为输入的令人讨厌的循环代码 -
function k1 = fact1(z1)
k1 = zeros(size(z1));
for ii = 1:size(z1,1)
for jj = 1:size(z1,2)
z = z1(ii,jj);
if z ~= 0
k1(ii,jj) = z .* fact1(z-1);
else
k1(ii,jj) = 1;
end
end
end
return
示例运行 -
>> fact1([1 2 7;3 2 1])
ans =
1 2 5040
6 2 1
答案 1 :(得分:2)
答案 2 :(得分:2)
不确定是否所有人都知道,但在MATLAB中定义了一个实际的factorial
函数,它可以接收任何大小的数组/矩阵,并计算元素因子。例如:
k = factorial([1 2 3 4; 5 6 7 8])
k =
1 2 6 24
120 720 5040 40320
即使这篇文章正在寻找一个递归实现,而且Divakar提供了一个解决方案,我仍然想把我的两分钱放进去并提出另一种选择。另外,假设我们无法访问factorial
,我们希望从第一原则计算出来。我个人要做的是创建一个与输入矩阵大小相同的单元格数组,但是这个单元格数组中的每个元素都是从1
到原始矩阵中每个位置定义的数字的线性索引数组。 。然后,您可以将prod
应用于每个单元格元素以计算阶乘。前提条件是没有数字小于1,并且所有元素都是整数。就这样:
z1 = ... ; %// Define input matrix here
z1_matr = arrayfun(@(x) 1:x, z1, 'uni', 0);
out = cellfun(@prod, z1_matr);
如果z1 = [1 2 3 4; 5 6 7 8];
,在我之前的示例中,我们使用上面的代码获得相同的输出:
out =
1 2 6 24
120 720 5040 40320
这显然会慢一点,因为之后会有arrayfun
然后cellfun
调用,但我想我会添加另一种方法,只是为了添加另一种方法:)不确定如何这是建设性的,但我想我会添加自己的方法并加入Divakar和Luis Mendo:)