2

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。

4

3 回答 3

1

您可以使用ndgrid和来实现arrayfun。考虑以下示例数据(字符串元胞数组):

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(v1{ii(k)},v2{jj(k)}) , 1:M*N, 'uni', false), M,N)

给出期望的结果:

ans = 

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

在一般情况下,只需根据需要定义v1,v2fun

于 2013-11-09T13:08:32.397 回答
0

这适用于示例数据:

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))
于 2013-11-09T11:42:38.670 回答
0

对 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 类型,请考虑repmatarrayfun的组合cellfun。如果没有更具体的问题,很难更具体。

于 2013-11-10T03:17:26.520 回答