2013-12-09 18 views
2

任何人都知道错误在哪里?非常感谢!bsxfun:矩阵的连接尺寸不一致

beta=randn(50,1); 
bsxfun(@(x1,x2) max([x1 x2 x1+x2]), beta, beta') 

错误消息:使用horzcat

误差矩阵的
尺寸被级联并不一致。
错误@(X1,X2)MAX([X1,X2,X1 + X2])

回答

1

这里是我(在bsxfun使用两个max

beta = randn(50,1); 
res = bsxfun(@(x,y) max(x, max(y, x+y)), beta, beta'); 

使用repmat

tmp = max(cat(3, repmat(beta,[1 50]), repmat(beta',[50 1]), ... 
        repmat(beta,[1 50])+ repmat(beta',[50 1])), [], 3); 
isequal(tmp, res) 
+0

这就是我想要的。为什么max(x,max(y,x + y))有效,但max([x y x + y])不是?如果我想得到成对结果矩阵[f(x1,x2)f(x1,x3)... f(x1,xN); f(x2,x1)f(x2,x2)... f(x2,xN); ...; f(xN,x1)f(xN,x2),...,f(xN,xN)]对于任何f? – yliueagle

+0

@yliueagle我不知道为什么'max([x y x + y])'不起作用。相信我,我试过了。我也尝试了一些其他的变体,比如'max(cat(3,x,y,x + y),[],3)' - 无济于事。 – Shai

+0

@yliueagle至于任意函数f(x,y)'你为什么不用'bsxfun'来试试它?如果你在一个m文件中实现这个功能,你可以在函数中放置一个断点,看看'x'和'y'是如何构建的... – Shai

2

我不知道你想达到什么100%,但误差在beta换位作为bsxfun的第三个参数;它的工作原理是这样的:

beta=randn(50,1); 
bsxfun(@(x1,x2) max([x1 x2 x1+x2]), beta, beta) 

bsxfun第二和第三个参数必须是相同的大小,以逐元素的二进制运算应用到它的。

编辑:从手册(http://www.mathworks.de/de/help/matlab/ref/bsxfun.html):

乐趣,也可以是句柄上面未列出 任何二进制逐元素的功能。形式C = fun(A,B) 的二进制元素方式函数接受的数组A和B任意但等同大小并且返回大小相同的输出 。输出数组C中的每个元素都是 的结果,仅对A和B的相应元素进行操作。

EDIT2:这是,你想要什么?

A = rand(1,50); 
[x, y] = ndgrid(1:length(A), 1:length(A)); 
idc = [x(:) y(:)]; 
allMin = min([A(idc(:,1)) A(idc(:,2)) A(idc(:,1))+A(idc(:,2))]); 

首先,与第二和第三代码线我生成索引的所有可能的组合(所有对i/j),例如:如果A有3个条目,idc看起来像:

1 1 
1 2 
1 3 
2 1 
2 2 
2 3 
3 1 
3 2 
3 3 

然后我建立包含该值A(i)A(j)A(i)+A(j)条目的每一行向量(ij)并获得它的min

+1

我有一个数组测试验证(例如:测试= randn(50,1))。我想计算所有成对i和j的min([beta(i)beta(j)beta(i)+ beta(j)]),避免使用循环。你有什么建议吗? TKS! – yliueagle

+0

@bjoern - 这是你的个人资料照片?你找不到更合适的东西吗? – Shai

+3

@Shai我认为这是最合适的,考虑到最近的要求,我们不得不“让代码变得性感”;-) –