逐列乘积:矩阵尺寸必须一致

时间:2018-10-05 11:24:48

标签: arrays matlab performance matrix

我在MATLAB中有一个矩阵A和一个整数B的向量。然后,我通过删除D中用相同整数索引的A的列并将其替换为零的一列来构造矩阵B。我有一个关于我用来构造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. 

如何解决这种保存效率?

1 个答案:

答案 0 :(得分:4)

问题是您的代码依赖于R2017b中引入的广播/隐式扩展。如果尝试以旧版本进行广播,则会出现尺寸错误。这就是为什么R {{2016}}中的[1 2] + [1;2]错误,但在更高版本中有效并给出2×2矩阵的原因。根据{{​​3}}的评论,该解决方案是使用Sardar Usama,它代表 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