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。
答案 0 :(得分: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
,v2
和fun
。
答案 1 :(得分: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))
答案 2 :(得分: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类型,请考虑repmat
,arrayfun
和cellfun
的组合。没有更具体的问题,很难更具体。