单例扩展的二元运算 - 标量输出

时间:2012-05-07 16:39:37

标签: matlab octave bsxfun

有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预先创建的,其余的将始终为零。

但情况并非总是如此 - 有时候我会得到一些真正的价值,而不仅仅是零 - 而且我担心会产生一些副作用(上面的点数产品是最简单的例子)。 / p>

问题

那么,是否存在类似于bsxfun的函数,但是根据这些向量的每个操作得到向量并期望一个标量?

1 个答案:

答案 0 :(得分: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

我不确定它会给出任何速度优势(我会想象一个显式循环会更快)但有时它可以更容易阅读。