如何在 Matlab 中对两个向量应用二元函数以获得所有成对结果的矩阵?

Posted

技术标签:

【中文标题】如何在 Matlab 中对两个向量应用二元函数以获得所有成对结果的矩阵?【英文标题】:How to apply a binary function in Matlab on two vectors to get a matrix of all pairwise results? 【发布时间】:2013-11-09 11:05:29 【问题描述】:

Matlab 中是否有任何函数可以采用两个向量(不一定具有相同大小)并对每对向量元素应用二元函数,从而得到矩阵 n1xn2,其中 n1 和 n2 是输入的长度向量?

类似于 pdist2 的东西,但使用任意函数指针而不是距离函数。

Example usage:
v1 = [1, 2, 3]
v2 = [2, 3]

Apply(@plus, v1, v2) -> [3, 4; 4, 5; 5, 6];

注意:虽然这个例子是数字的,但我需要使用的实际向量是单元格数组,每个单元格都包含一个字符串(所有字符串的长度都相等)。二进制函数接受两个字符串并返回一个标量,例如 - strcmp。

【问题讨论】:

我发布的答案适用于示例数据。目前还不清楚您要如何添加字符串。你能举个例子吗?如果v1 = 'one', 'two'v2 = 'the', 'cat', 'dog',你想要什么? 更新了问题。该函数接收两个字符串并返回一个标量,想想 - strcmp, strcat ... 我还不清楚...请提供一个带字符串的示例。 v1 = ['one', 'two']; v2 = ['two', 'three']。应用(@strcmp, v1, v2) -> [0, 0; 1, 0] 【参考方案1】:

您可以使用ndgridarrayfun 实现这一目标。考虑以下示例数据(字符串元胞数组):

v1 = 'aa','bb','cc';
v2 = '1','22';

和示例函数(字符串连接):

fun = @(str1, str2) [str1 str2]

然后:

M = length(v1);
N = length(v2);
[ii jj] = ndgrid(1:M, 1:N);
reshape(arrayfun(@(k) fun(v1ii(k),v2jj(k)) , 1:M*N, 'uni', false), M,N)

给出想要的结果:

ans = 

    'aa1'    'aa22'
    'bb1'    'bb22'
    'cc1'    'cc22'

一般情况下,只需根据需要定义v1v2fun即可。

【讨论】:

这似乎可行,但 arrayfun 非常慢。不确定它是否比 for 循环快。 实际上并不比for 快。您可以轻松地将其替换为for。我认为对于任意功能很难避免使用accumarray/for。也许对于您的特定功能,它可以被矢量化。告诉我们函数是什么... 在转换我的函数后,它可以使用矩阵输入而不是字符串输入,我已将repmat-ed 输入向量传递给它。问题是新函数比原来的函数更复杂/可读性更差。【参考方案2】:

这个适用于示例数据:

repmat(v2,numel(v1),1)+[v1(:), v1(:)]

ans =
     3     4
     4     5
     5     6

更新

如果numel(v2) ~= 2 尝试这样的事情(仍然仅适用于您提供的数字示例):

repmat(v2,numel(v1),1)+repmat(v1(:),1,numel(v2))

【讨论】:

它还假设 v2 正好有两个元素。 在数字情况下,bsxfun(@plus, v1', v2) 更容易。【参考方案3】:

对 OP 的最后一条评论(与问题的内容非常不同)的回答如下:

>> v1 = ['one', 'two']; v2 = ['two', 'three'];
>> cellfun(@strcmp,repmat(v1',1,size(v2,2)),repmat(v2,size(v1,2),1))

ans =

     0     0
     1     0

对于问题中的示例数字数据和加号运算,解决方法:

>> v1 = [1, 2, 3]; v2 = [2, 3];
>> bsxfun(@plus,v1',v2)

ans =

     3     4
     4     5
     5     6

不过,我认为 Luis Mendo 很好地回答了字符串连接问题的答案。

一般来说,要对所有对执行操作,bsxfun 应该是数值数组的首选函数。对于单元格、字符串和其他非 POD 类型,请考虑 repmatarrayfuncellfun 的组合。如果没有更具体的问题,很难更具体。

【讨论】:

以上是关于如何在 Matlab 中对两个向量应用二元函数以获得所有成对结果的矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

相关向量机 (RVM) -Matlab

相关向量机 (RVM) -Matlab

如何用Matlab画二元函数?

C++11 中 std::threads 向量的问题计算字母和单词的二元组

matlab求二元一次方程组

matlab函数