【问题标题】:bsxfun: Dimensions of matrices being concatenated are not consistentbsxfun:被连接的矩阵的维度不一致
【发布时间】: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]) 中的错误

【问题讨论】:

    标签: matlab bsxfun


    【解决方案1】:

    我不是 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
    

    然后我为每行条目(ij)构建一个包含值A(i)A(j)A(i)+A(j) 的向量,并获取它的min

    【讨论】:

    • 我有一个数组 beta(例如:beta=randn(50,1))。我想为所有成对的 i 和 j 计算 min([beta(i) beta(j) beta(i)+beta(j)]),避免使用循环。你有什么建议吗?谢了!
    • @bjoern - 这是你的头像?你找不到更合适的吗?
    • @Shai 我会说这是最合适的,考虑到最近我们不得不“让代码变得性感”的请求;-)
    • @bjoern:不完全是。我试过你的代码,结果只得到一个值。实际上我想得到一个矩阵,看起来像 [f(x1,x1) f(x1,x2) ... f(x1,xN); f(x2,x1) f(x2,x2) ... f(x2,xN);...; f(xN,x1) f(xN,x2) ... f(xN,xN)]。其中 f 是 x1 和 x2 上的某个函数。
    • @user3046721 为此,请使用bsxfun(f, repmat(beta,1,50), repmat(beta.',50,1))
    【解决方案2】:

    这是我得到的(在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, 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 我不知道为什么max([x y x+y]) 不起作用。相信我,我试过了。我还尝试了一些其他变体,例如 max( cat( 3, x, y, x+y), [], 3 ) - 无济于事。
    • @yliueagle 至于任意函数f(x,y),你为什么不试试bsxfun?如果您在 m 文件中实现该函数,您可以在该函数中放置一个断点,看看 xy 是如何构造的...
    • @yliueagle BTW,如果此解决方案适合您,请考虑单击旁边的灰色“V”图标“接受”它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多