罗兰的MATLAB艺术

将想法转化为MATLAB

标量展开及更多

上周,我收到了一位博客读者的电子邮件,询问如何扩展算术运算符的含义,使其不仅仅进行标量展开,而是将其扩展到单例维度。在这篇文章中,我将讨论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的用户,已经开发了一个广义算子库它也可以用来解决这类问题(以及更多)。

四个选项

我可以想到四种方法来处理标量以外的展开式。

  1. 保持现状,因为已经有很多方法可以实现用户想要的。
  2. 创建新函数,灵活地处理elementwise(可能还有矩阵)操作的不同大小数组的组合。
  3. 改变MATLAB中的基本运算符,如+可容纳大小相称但不相同的数组。
  4. 发明新的操作符表示法,以适应我们迄今为止讨论过的按元素排序的二进制操作。

优点和缺点

以上观点各有利弊。过去我们曾与一些用户讨论过这个话题,他们的反应大致分为三大类:

  • 喜欢改变元素操作符的含义,例如,行+列将执行“外部”求和。
  • 出于可读性和向后兼容性的原因,讨厌改变现有操作符的含义。
  • 无所谓(到目前为止,这是最小的一群人!)

现在轮到你了

现在轮到你插话了。请留下你对这个话题的看法在这里

|

评论

请点击留言在这里登录到您的MathWorks帐户或创建一个新帐户。