【问题标题】:Binary operation with singleton expansion -- scalar output单例展开的二元运算——标量输出
【发布时间】:2012-05-07 16:39:37
【问题描述】:

有 bsxfun:http://www.mathworks.com/help/techdoc/ref/bsxfun.html 这样的功能,但是它在逐个元素模式下工作。我想要在逐个向量模式下工作的类似函数(以及标量输出)。

作为说明,我会尝试以这种方式在这里使用 bsxfun。作为内部函数,我将使用(这只是一个示例)向量的点积。

function f = foo(a,b), f=a'*b; printf("called\n");, end

上面的虚拟函数foo 需要2 个向量,结果是标量。每次调用它时,我们都会看到一条消息。

bsxfun(@foo,[2;3],[1 5;4 3])

结果是:

called
called
ans =

   14   19
    0    0

所以,两个调用(很好),但是我们得到了一个矩阵,而不是一个向量(2 个标量对)。可以说,在这种情况下只获取第一行就足够了,因为矩阵是 bsxfun 预先创建的,其余的将始终为零。

但情况并非总是如此——有时我得到了一些实际值,而不仅仅是零——而且恐怕会涉及到一些副作用(上面的点积是最简单的例子)。

问题

那么,是否有一个类似于 bsxfun 的函数,但它获取向量并期望每个向量的每个操作都有一个标量?

【问题讨论】:

    标签: matlab octave bsxfun


    【解决方案1】:

    我认为没有内置函数,但使用 arrayfun 或 cellfun 你也许可以做一些事情。通常 arrayfun 也是元素方面的,但如果你首先将较大的数组拆分为一个单元格,那么你可以这样做:

    foo = @(a,b) b*a
    y = [2;3];
    X = [1 5; 4 3];
    % split X into cell array of rows
    % apply foo to each row
    cellfun(@(x) foo(y,x), num2cell(X,2))
    ans = 
        17
        17
    

    我不确定它是否会带来任何速度优势(我想显式循环会更快),但有时它更容易阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-31
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2014-10-10
      • 1970-01-01
      相关资源
      最近更新 更多