【问题标题】:Column by column product: matrix dimensions must agree逐列乘积:矩阵维度必须一致
【发布时间】:2019-03-10 21:35:56
【问题描述】:

我在 MATLAB 中有一个矩阵 A 和一个整数向量 B。然后,我通过删除在B 中由相同整数索引的A 的列并用一列零替换它们来构造一个矩阵D。我对用于构造 D 的代码有疑问,因为它似乎在 MATLAB R2017b 中有效,但在 MATLAB R2015b 中无效。

让我用一个例子更好地解释一下:

b=8;
g=3;

B=[1;2;2;2;3;4;4;5]; %bx1
bnew=size(unique(B),1);

A=[1  2  3  4  5  6  7  8;
   9  10 11 12 13 14 15 16;
   17 18 19 20 21 22 23 24]; %gxb

矩阵B 告诉我们应该删除A 的哪些列并用一列零替换。例如:B的第二个、第三个、第四个元素相等;这意味着应该删除A 的第二、第三和第四列,并添加一列零。

因此,

D=[1  0  5   0  8;
   9  0  13  0  16;
   17 0  21  0  24]; %gxbnew

要构造D,我这样做:

C=sparse(1:numel(B),B,1); 
E = A * C;
D= E .* (sum(C) <= 1); 

注意:将C,E,D 视为稀疏很重要,因为在我的实际情况下它们非常大。在这方面,可以例如考虑通过做得到D

C=sparse(1:numel(B),B,1); 
D = E;
D(:, sum(C) > 1) = 0;

但我不想要这个,因为它非常慢。


问题:当我跑步时

C=sparse(1:numel(B),B,1); 
E = A * C;
D= E .* (sum(C) <= 1); 

在 MATLAB R2017b 中它工作得很好,但是当我在 MATLAB R2015b 中运行它时,它不喜欢最后一行并给出错误

Error using .*
Matrix dimensions must agree. 

如何解决这个保存效率问题?

【问题讨论】:

  • 谢谢@Adriaan。关于如何在不降低速度的情况下为 Matlab_R2015b 解决此问题的任何想法?

标签: arrays matlab performance matrix


【解决方案1】:

问题是您的代码依赖于 R2017b 中的广播/隐式扩展,这是在 R2016b 中引入的。如果您尝试在旧版本中进行广播,则会出现尺寸错误。这就是为什么 [1 2] + [1;2] 在 R2016b 之前出现错误,但在更高版本中有效并提供 2×2 矩阵。解决方案是,正如Sardar Usama 评论使用bsxfun,它代表Binary Singleton eXpansion FUNction,这意味着它与现在默认启用的隐式扩展相同。

A = [1 2]; % 1x2
B = [3;4]; % 2x1
C = B*A; % 2x2 matrix in post-R2016b, dimension error in pre-R2016b
D = bsxfun(@times,B,A); % Working pre-R2016b

如果您希望您的代码在两个版本上都能正常工作,请使用 bsxfun,或者将其包装在 try/catch 块中:

try % try implicit expansion
    C = B*A;
catch % if that fails, use bsxfun
    C = bsxfun(@times,B,A);
end

引用bsxfun 文档:

在 MATLAB® R2016b 及更高版本中,此表中列出的内置二进制函数独立支持隐式扩展。使用这些函数,您可以直接调用函数或运算符,而不是使用bsxfun。例如,您可以将C = bsxfun(@plus,A,B) 替换为A+B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2015-01-20
    相关资源
    最近更新 更多