标量展开及更多
上周,我收到了一位博客读者的电子邮件,询问如何扩展算术运算符的含义,使其不仅仅进行标量展开,而是将其扩展到单例维度。在这篇文章中,我将讨论MATLAB中标量展开的发展,讨论未来可能的设计,并将讨论扩展到您的输入。本着这一精神,请就这个话题发表你的评论在这里.
内容
算术标量展开式
在MATLAB的早期版本中,当执行基于元素的算术运算时,您可以依赖于标量展开。例如,在下面的代码中,
一个=魔法(3);B = 2;C = a + b;
标量B添加到?的每个元素中一个.
分配的标量展开
直到MATLAB版本5和n维数组的引入,标量展开式才扩展到赋值,例如,
D (3:5, 1:2) = 17
D = 0 0 0 0 17 17 17 17 17 17 17 17 17 17
取代了右手边和左手边完全一样大小的需要。
那么比标量展开式呢?
从新闻组帖子的数量来判断(见以下链接中的一些链接:123.45),有很多人想要有一种简洁地表达计算的方法,这种方法不涉及完全匹配的标量或数组,但有一个合理的解释,例如,计算——意思是()在哪里一个是一个矩阵。
如何增加常数值的每一列的矩阵
假设我们要给矩阵的每一列加上一个常数。这里有一些我们今天可能做的方法,所有这些都至少需要一些MATLAB的临时额外内存。如果矩阵很大,那么第二个变量的临时变量也会很大,可能会消耗大量额外的内存。
行= 1:4;Mat = [magic(3) (10:12)']
Mat = 8 1 6 10 3 5 7 11 4 9 2 12
循环遍历矩阵的列,每列加上一个标量值
=垫;为C = 1:length(row) out(:, C) = out(:, C) + row(C);结束
将行展开为更大的矩阵,其大小为垫3种不同的方式。
第一种方法是通过对行向量进行索引,这种技术被称为Tony的技巧,因为一个客户Tony在1990年Albuquerque的ICASSP会议上向我展示了它
Out1 = mat + row(ones(1,size(mat,1)),:);
它的第二种使用方法repmat在大多数情况下都会用到托尼的技巧。
Out2 = mat + repmat(row, size(mat,1),1);
第三种变体是使用外部积来复制行。
Out3 = mat + ones(size(mat,1),1) * row;
确保我们的答案都一样。
isequal(着干活,out2 out3)
ans = 1
Doug Schwarz,一个长期使用MATLAB的用户,已经开发了一个广义算子库它也可以用来解决这类问题(以及更多)。
四个选项
我可以想到四种方法来处理标量以外的展开式。
- 保持现状,因为已经有很多方法可以实现用户想要的。
- 创建新函数,灵活地处理elementwise(可能还有矩阵)操作的不同大小数组的组合。
- 改变MATLAB中的基本运算符,如+可容纳大小相称但不相同的数组。
- 发明新的操作符表示法,以适应我们迄今为止讨论过的按元素排序的二进制操作。
优点和缺点
以上观点各有利弊。过去我们曾与一些用户讨论过这个话题,他们的反应大致分为三大类:
- 喜欢改变元素操作符的含义,例如,行+列将执行“外部”求和。
- 出于可读性和向后兼容性的原因,讨厌改变现有操作符的含义。
- 无所谓(到目前为止,这是最小的一群人!)
现在轮到你了
现在轮到你插话了。请留下你对这个话题的看法在这里.
评论
请点击留言在这里登录到您的MathWorks帐户或创建一个新帐户。