在MATLAB中,我想将函数应用于矩阵A
和B
中的每对列向量。我知道必须有一种有效的(非for
)方法,但我无法弄明白。该函数将输出标量。
答案 0 :(得分:7)
尝试
na = size(A,1);
nb = size(B,1);
newvector = bsxfun(@(j,k)(func(A(j,:),B(k,:))),1:na,(1:nb)');
bsxfun
在1:na和(1:nb)'上执行单例扩展。在这种情况下,最终结果是func将应用于从A和B绘制的每对列向量。
请注意,bsxfun可能很棘手:它可能要求应用的函数本身支持单例扩展。在这种情况下,它可以完成你想要的工作。
答案 1 :(得分:1)
你的意思是成对吗?所以在for循环中,函数将作为scalar_val = func(A(i),B(i))
?
如果A
和B
具有相同的尺寸,您可以应用ARRAYFUN功能:
newvector = arrayfun(@(x) func(A(x),B(x)), 1:numel(A));
<强>更新强>:
根据您的评论,您需要将A和B的所有组合作为scalar_val = func(A(i), B(j))
运行。这有点复杂,对于大型矢量可以快速填充内存。
如果您的功能是标准功能之一,可以尝试使用BSXFUN:
out = bsxfun(@plus, A, B');
另一种方法是使用MESHGRID和ARRAYFUN:
[Am, Bm] = meshgrid(A,B);
out = arrayfun(@(x) func(Am(x),Bm(x)), 1:numel(Am));
out = reshape(out, numel(A), numel(B));
我相信它应该有效,但我现在没有时间对它进行测试。