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

2024-03-03

我正在使用单元格来管理我正在处理的一些内容中的数据。我希望能够做这样的事情:

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 中的内置数据类型创建新运算符或重载现有运算符。我在中描述了一个例子我的答案 https://stackoverflow.com/a/2430278/52738另一个关于的问题修改整数类型的默认溢出行为 https://stackoverflow.com/q/2425251/52738.

首先,您可能想了解当前元胞数组有哪些方法。您可以使用该功能来做到这一点METHODS http://www.mathworks.com/help/matlab/ref/methods.html,这是我在 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           

算术运算符方法将显示在上面的列表中函数等价物 http://www.mathworks.com/help/matlab/arithmetic-operators.html, like plus为了+运算符或times为了.*操作员。只有transpose方法 (.'运算符)是为元胞数组定义的。您必须自己创建其余部分,定义给定运算符对元胞数组参数的行为方式。

您可以通过首先创建一个名为的新文件夹来完成此操作@cell并将其放置在您的现有文件夹中MATLAB 路径 https://www.mathworks.com/help/matlab/matlab_env/what-is-the-matlab-search-path.html。然后,您可以将新方法放入@cell文件夹。例如,一个very简单的实现plus元胞数组的方法(没有任何输入检查、错误检查等)将是这样的:

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

在上面的代码中,您可能首先要检查操作数A and 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

我无法真正谈论幕后优化以及这可能会如何影响它们。我知道文档《提高绩效的技术》 http://www.mathworks.com/help/techdoc/matlab_prog/f8-784135.html特别提到这一点重载内置函数 http://www.mathworks.com/help/techdoc/matlab_prog/f8-784135.html#f8-790494:

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

但是,就您而言,您没有超载existing一个类的函数。您只是创建了该类中不存在的新类,因此很难说这最终会对性能产生什么影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB:是否可以在本机构造(单元格、结构等)上重载运算符? 的相关文章

  • 连接每第 n 行

    我在矩阵中得到了一个数据集 如下所示 从 Excel 导入 matrix Cat1 1 2 3 4 Cat2 9 10 11 12 Cat3 17 18 19 20 Cat1 5 6 7 8 Cat2 13 14 15 16 Cat3 21
  • 为什么不使用强制转换语法调用“operator void”?

    玩的时候这个答案 https stackoverflow com questions 4030959 will a variablename c statement be a no op at all times 4030983 40309
  • 如何在不使用 MATLAB 的情况下打开 .mat 文件?

    我在Matlab中做了一个项目 现在我已经卸载了Matlab 现在 我需要一些我的项目的参考 我留下了所有 mat 文件 我正在尝试在记事本中打开它们 并且我在那里得到了 unicode 字符 我的问题很简单 如何在记事本或某些文字处理器中
  • 使用 Polyfit 进行垂直线拟合

    这只是一个基本问题 我正在使用拟合线来分散点polyfit 在某些情况下 我的散点具有相同的 X 值并且polyfit无法在其上放置一条线 必须有某种东西可以处理这种情况 毕竟 它只是一个线配合 我可以尝试交换 X 和 Y 然后再画一条线
  • 使用 sprintf 打印元素数量可变的向量

    在下面的代码中 我可以打印向量中的所有元素item用空格分隔为 item 123 456 789 sprintf d d d item ans 123 456 789 我怎样才能做到这一点而不必输入那么多 d作为元素的数量item 最简单的
  • MATLAB 颜色条刻度标记错误?

    我正在绘制 9 个子图 如下图所示 其中一个颜色条代表三个子图 在这里我想将颜色条中的最高值显示为 gt value 令人惊讶的是 当我手动将刻度标签编辑为h TickLabels end gt h TickLabels end 颜色条开始
  • Matlab:不正确的索引矩阵参考(或智胜matlab)

    我希望能够写jasmine http pivotal github io jasmine 类似于 Matlab 中的测试 所以像 expect myfibonacci 0 toBe 0 expect myfibonacci 5 toBe 1
  • 如何绘制 NxN 圆数组?

    我想绘制一个 NxN 的圆数组 为了形象化 我附上了我想要实现的目标的图像 我是 MatlLab 的新手 所以我尝试先绘制一个圆 下面是示例代码 n 2 10 size of mask M zeros n I 1 n x I n 2 mas
  • 在 MATLAB 中分析 wav 文件

    所以我有这个钢琴录音 wav 格式 我能够做一个FFT整体记录并识别频率 然而 根据我读过的一些文章 最好将 wav 文件分解为多个窗口 其中每个窗口都包含一个特定的音符 为此 我需要首先绘制时域信号的 功率包络 考虑音符平均能量概念 因此
  • 梯度下降Matlab实现

    我已经浏览了堆栈溢出中的许多代码 并在同一行上编写了自己的代码 这段代码有一些问题我无法理解 我正在存储值 theta1 和 theta 2 以及用于分析目的的成本函数 x 和 Y 的数据可以从此下载页 它具有 dat 文件形式的 x 和
  • 读取 MEX 文件中的 4D 数组

    我在 MATLAB 中有一个 4 维数组 我正在尝试访问 MEX 函数中的数组 下面创建 testmatrix 一个 4 维矩阵 已知数据为uint8 type Create a 4D array 2x 2y rgb 3 framenumb
  • 使用变体泛型委托类型对运算符 == 进行重载解析

    重载解析的精确规则是什么 两个委托类型表达式之间 考虑以下代码 其中using System 是需要的 static class ProgramA static void TargetMethod object obj static voi
  • 如何从 Matlab 在 vi​​rtualenv 中执行 Python 代码

    我正在创建一个用于研究的 Matlab 工具箱 我需要执行 Matlab 代码 但也需要执行 Python 代码 我想允许用户从 Matlab 执行 Python 代码 问题是 如果我立即执行此操作 我将必须在 Python 环境中安装所有
  • 如何将向量标准化/非标准化到范围 [-1;1]

    我怎么能够正常化到范围的向量 1 1 我想使用函数norm 因为它会更快 也让我知道我该怎么做非规范化之后的向量正常化 norm对向量进行归一化 使其平方和为 1 如果要对向量进行归一化 使其所有元素都在 0 和 1 之间 则需要使用最小值
  • 我的 matlab 图中需要不同的颜色

    这是我的情节代码 问题是我的图中的两条线具有相同的颜色 我需要为图中的每条线 总共 4 条线 分配一个特殊的颜色 for i 1 nFolderContents data hdrload folderContents i if size f
  • 有没有办法在 MATLAB 中执行函数内联?

    我可以使用什么语言功能或开箱即用的技巧来完成 MATLAB 中的函数内联 令人烦恼的是 Google 搜索 matlab 内联函数 http www google com search q matlab inline function揭示了
  • 如何在 R 中导入 matlab 表

    我有一个matlab mat文件与表数据类型我想将其导入 R 中 我为此使用 readMat R 正在将其作为列表读取 之后有没有办法将列表转换为 R 中的数据帧或表格格式 当我使用as dataframe我收到以下错误 Error in
  • 如何在matlab中绘制彩色一维直方图

    我有一个一维数组 X 其中包含相关系数的统计数据 我想绘制一个彩色直方图 我使用以下代码 histogram X 10 它可以创建具有单色的直方图 现在我想绘制一个直方图 其中每个条形都有不同的颜色 但 FaceColor 选项只能调整整个
  • 使用 lsqcurvefit 进行拟合

    我想将一些数据拟合到洛伦兹函数 但当我使用不同数量级的参数时 我发现拟合存在问题 这是我的洛伦兹函数 function value lorentz x x0 gamma amp value amp gamma 2 x x0 2 gamma
  • 为什么我必须在 POD 类型中重载operator==?

    我有一个定义如下的结构 struct Vec3 float x y z 当我尝试使用时std unique on a std vector

随机推荐