【发布时间】:2013-12-09 15:41:50
【问题描述】:
任何人都知道错误在哪里?非常感谢!
beta=randn(50,1);
bsxfun(@(x1,x2) max([x1 x2 x1+x2]), beta, beta')
错误信息:
使用 horzcat 时出错
被连接的矩阵的维度不一致。
@(x1,x2)max([x1,x2,x1+x2]) 中的错误
【问题讨论】:
任何人都知道错误在哪里?非常感谢!
beta=randn(50,1);
bsxfun(@(x1,x2) max([x1 x2 x1+x2]), beta, beta')
错误信息:
使用 horzcat 时出错
被连接的矩阵的维度不一致。
@(x1,x2)max([x1,x2,x1+x2]) 中的错误
【问题讨论】:
我不是 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):
fun 也可以是任何二进制元素函数的句柄,而不是 以上所列。 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
然后我为每行条目(i、j)构建一个包含值A(i)、A(j) 和A(i)+A(j) 的向量,并获取它的min。
【讨论】:
bsxfun(f, repmat(beta,1,50), repmat(beta.',50,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 )
【讨论】:
max([x y x+y]) 不起作用。相信我,我试过了。我还尝试了一些其他变体,例如 max( cat( 3, x, y, x+y), [], 3 ) - 无济于事。
f(x,y),你为什么不试试bsxfun?如果您在 m 文件中实现该函数,您可以在该函数中放置一个断点,看看 x 和 y 是如何构造的...