针对矩阵的每一行应用bsxfun或arrayfun函数

5
有两个矩阵A和B,它们的大小分别为m乘4和n乘4。我的问题是如何在A和B的每一行上应用一个函数f,该函数将两个1x4向量作为输入。结果将是一个大小为m乘n的矩阵。result中的元素[i,j]是f(A(i,:),B(j,:))。
例如:
A = rand(3, 4);
B = rand(5, 4);
for i = 1 : 3
    for j = 1 : 5
        result(i, j) = rectint(A(i, :), B(j, :));
    end
end

我能用bsxfunarrayfun来完成这个任务吗?


我的猜测是你可以按照你写的那样去做 - bsxfun是逐元素操作的,我不认为你可以滥用它。 - j_kubik
你能否重新编写rectint函数,使其接受并返回矩阵呢? - David
@David,“rectint”是Matlab内置函数,用于计算矩形的重叠部分。 - Fihop
我认为使用meshgrid将是最简单的解决方案,正如Luis Mendo的回答所述。 - David
@David:不需要重写rectint。它已经处理矩阵了。虽然,这似乎只是一个例子。 - chappjc
2个回答

7

如果您首先使用 meshgrid 生成所有行的组合,则可以使用 arrayfun

[ii jj] = meshgrid(1:size(A,1),1:size(B,1));
result = arrayfun(@(n) rectint( A(ii(n),:), B(jj(n),:) ), 1:numel(ii) );
result = reshape(result, size(B,1), size(A,1)).';

当然,您可以用任何接受两个向量输入并返回一个数字的函数替换rectint


2

这个功能已经内置在rectint中。对于语法rectint(A,B)

AB也可以是矩阵,其中每行都是一个位置向量。 AREA是一个矩阵,给出了由A指定的所有矩形与由B指定的所有矩形的交集。也就是说,如果AM-by-4BN-by-4,那么AREA就是一个M-by-N的矩阵...

因此,您只需执行result = rectint(A,B);即可获得所需的矩阵。


1
是的,rectint 可以处理矩阵。只是举个例子而已。 - Fihop
@FihopZz:公正的问题。我只是不得不指出这一点 - 以为我要疯了。:) 无论如何,Luis Mendo的答案对于具有向量输入和标量输出的函数来说是一个非常准确的演示,我认为。 - chappjc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接