矩阵输入的重复功能

时间:2014-09-16 17:14:27

标签: matlab

我相信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]。

感谢任何帮助。非常感谢你!

3 个答案:

答案 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)

您可以使用gamma函数计算阶乘而不递归:

function k = fact(z)
k = gamma(z+1);

示例:

>> fact([1 2 3 4])
ans =
     1     2     6    24

答案 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:)