Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-14, 20:46   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB:是否可以在本机结构(单元,结构等)上重载运算符?

我正在使用单元来管理我正在处理的某些内容中的数据。我希望能够做以下事情:

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(或其他任何东西)可以轻松地确定它应该进行如下计算:

Z{kk} = c1*A{kk} + c2*B{kk} 甚至比这更好的优化。除此以外。它最终可能会导致速度变慢和/或内存效率降低,例如:

temp1 = cellfun( @(X)( c1*X ), A ); temp2 = cellfun( @(X)( c2*X ), B ); Z = cellfun( @plus, temp1, temp2 ); 假设MATLAB或Jacket无法对其进行优化,则最终将占用过多的内存。



回答:

实际上,可以为MATLAB中的内置数据类型创建新的运算符或重载现有的运算符。我在回答有关修改整数类型的默认溢出行为的另一个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 算术运算符方法将显示在上面的列表作为其功能等价物 ,像plus了+运营商或times的.*运算符。仅对单元格数组定义了transpose方法( .'运算符)。您必须自己创建其余部分,定义给定的运算符对单元数组参数的行为。

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

function C = plus(A,B) C = cellfun(@plus,A,B,'UniformOutput',false); %# Apply plus cell-wise end 在上面的代码中,您可能首先要检查操作数A和B是否为相同大小的单元格数组。但是,您可以创建所需的任何独特功能,例如允许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 我不能真正谈论幕后的优化及其对它们的影响。我知道文档“提高性能的技术”特别提到了有关重载内置函数的问题
在任何标准MATLAB数据类上重载MATLAB内置函数都会对性能产生负面影响。例如,如果重载plus函数以不同方式处理任何整数类,则可能会妨碍MATLAB内置函数代码中对plus某些优化,从而可能会使使用此重载的所有程序变慢。

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



更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 01:19


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.