我在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.
如何解决这种保存效率?
答案 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
。