MATLAB:是不是可以在本机构造(单元格、结构等)上重载运算符?

Posted

技术标签:

【中文标题】MATLAB:是不是可以在本机构造(单元格、结构等)上重载运算符?【英文标题】:MATLAB: Is it possible to overload operators on native constructs (cells, structs, etc)?MATLAB:是否可以在本机构造(单元格、结构等)上重载运算符? 【发布时间】:2011-07-18 22:31:14 【问题描述】:

我正在使用单元格来管理我正在处理的一些事情中的数据。我希望能够执行以下操作:

A = cellfun( @(X)( randn( 5,5 ) ), cell( 5,1 ), 'UniformOutput', 0 );
B = cellfun( @(X)( randn( 5,5 ) ), cell( 5,1 ), 'UniformOutput', 0 );
%#
%# Each of the following would fail if cell member dimensions
%# don't match up
%#
%# matrix sums for each cell entry
%# C = A + B;
C = cellfun( @(X,Y)( X + Y ), A, B, 'UniformOutput', 0 );
%#
%# direct/hadamard product
%# D = A .* B;
D = cellfun( @(X,Y)( X .* Y ), A, B, 'UniformOutput', 0 );
%#
%# matrix-matrix products (not across all entries)
%# E = A * B;
E = cellfun( @(X,Y)( X * Y ), A, B, 'UniformOutput', 0 );

但是,我不希望使用极其冗长的语法来做到这一点。当我只想为单元格上的数学运算符提供定义时,为此创建一个新类似乎有点过分了。

问题:上课是唯一的方法吗?

如果我编写一个类来执行此操作,它肯定会使编写代码更容易。我看到的最大的负面影响与优化有关,尽管还有一些其他的事情让我感到烦恼..

在幕后进行的任何优化(例如,当 Jacket 编译某些东西以在 GPU 上运行时)可能会更难确定要进行哪些优化。例如,假设我有两个单元格 (A,B),其中包含许多适当维度的矩阵。如果我编写代码来生成一个新单元格:

Z = c1*A + c2*B

... 使用标量 c1,c2,我可以这样编写它,以便 Jacket(或其他)可以轻松确定它应该按以下方式进行计算:

Zkk = c1*Akk + c2*Bkk

或者比这更好的优化。否则。它最终可能会导致速度变慢和/或内存效率降低,例如:

temp1 = cellfun( @(X)( c1*X ), A );
temp2 = cellfun( @(X)( c2*X ), B );
Z     = cellfun( @plus, temp1, temp2 );

假设 MATLAB 或 Jacket 无法对其进行优化,这最终会占用过多的内存。

【问题讨论】:

我不明白这里的问题?你想做什么?您列出的所有命令都是完全有效的。 我稍微修改了这个问题。每个“cellfun”系列都是现在需要做的。就在它上面的那一行是我宁愿写的。 【参考方案1】:

事实上,可以为 MATLAB 中的内置数据类型创建新的运算符或重载现有的运算符。我在my answer 中描述了一个关于modifying the default overflow behavior of integer types 的SO 问题的示例。

首先,您可能想查看当前存在哪些用于元胞数组的方法。您可以使用函数METHODS 执行此操作,这是我在 MATLAB R2010b 中得到的:

>> methods cell

Methods for class cell:

aa2nt            issorted         regexptranslate  strfind          
accumarray       newdepfun        reshape          strjust          
cell2struct      nt2aa            rna2dna          strmatch         
ctranspose       nwalign          seq2regexp       strtok           
display          permute          setdiff          transpose        
dna2rna          regexp           setxor           union            
intersect        regexpi          sort             unique           
ismember         regexprep        strcat           

算术运算符方法将在上面的列表中显示为它们的function equivalents,例如plus 用于+ 运算符或times 用于.* 运算符。仅为元胞数组定义了 transpose 方法(.' 运算符)。您必须自己创建其余部分,定义给定运算符对元胞数组参数的行为方式。

您可以先创建一个名为@cell 的新文件夹,然后将其放在MATLAB path 上的现有文件夹中。然后,您可以将新方法放在@cell 文件夹中。例如,对于元胞数组(没有任何输入检查、错误检查等)的plus 方法的非常简单实现将是:

function C = plus(A,B)
  C = cellfun(@plus,A,B,'UniformOutput',false);  %# Apply plus cell-wise
end

在上面的代码中,您可能首先要检查操作数 AB 是否是大小相同的元胞数组。但是,您可以创建任何您想要的独特功能,例如允许B 成为一个标量值,该值将添加到A 的每个单元格中。完全由您来定义 + 运算符对元胞数组的行为方式。

这将允许您以更紧凑的方式编写代码,如下例所示:

>> A = [1 2 3] [4 5] 6;  %# One 3-element cell array
>> B = 5 [4 5] 2;        %# Another 3-element cell array
>> C = A+B;                %# Use the new plus operator
>> C:                    %# Display the cell contents

ans =

     6     7     8

ans =

     8    10

ans =

     8

我无法真正谈论幕后优化以及这可能会如何影响它们。我知道"Techniques for Improving Performance" 的文档特别提到了overloading built-in functions:

重载 MATLAB 内置函数 在任何标准 MATLAB 数据上 课程会产生负面影响 表现。例如,如果您 重载plus 函数来处理 任何整数类 不同的是,您可能会阻碍某些 MATLAB 内置优化 plus 的功能代码,因此可能 减慢任何使用的程序 这个重载。

但是,在您的情况下,您并没有为类重载 现有 函数。您只是在创建该类不存在的新类,因此很难说这最终会对性能产生什么影响。

【讨论】:

哇。这正是我所需要的正是,您甚至还介绍了有关优化的内容。太糟糕了,我不能为此给予奖励积分。

以上是关于MATLAB:是不是可以在本机构造(单元格、结构等)上重载运算符?的主要内容,如果未能解决你的问题,请参考以下文章

在 Matlab 中访问单元格中的向量

Matlab:将单元格数组转换为单个单元格数组

将matlab中单元格的内容打印到文件中

如何在Xamarin.iOS本机平台中扩展tableview单元格?

MATLAB如何提取结构体中数据

MATLAB:从读取并放入单元格的csv文件制作直方图?