将对象与左侧的常量相乘

2023-11-22

我有一个Matrix类并且它已经超载了*用于标量和矩阵乘法的运算符。

template <class T> class Matrix
{
    public:
        // ...
        Matrix operator*(T scalar) const;
        // ...
}

// ...

template <class T>
Matrix<T> Matrix<T>::operator*(T RightScalar) const
{
    Matrix<T> ResultMatrix(m_unRowSize, m_unColSize);
    for (uint64_t i=0; i<m_unRowSize; i++)
    {
        for (uint64_t j=0; j<m_unColSize; j++)
        {
            ResultMatrix(i, j) = TheMatrix[m_unColSize * i + j] * RightScalar;
        }
    }
    return ResultMatrix;
}

// ...

我可以将矩阵对象与右侧的标量相乘,没有任何问题:

Matrix<double> X(3, 3, /* ... */);  // Define a 3x3 matrix and initialize its contents
Matrix<double> Y;                   // Define an output matrix
Y = X * 10.0;                       // Do the linear operation

但是,我如何以同样的方式从左侧相乘呢?

Matrix<double> X(3, 3, /* ... */);
Matrix<double> Y;
Y = 10.0 * X;

在算术中,乘法时将常量写在左侧是一种常见的表示法。我想遵守这条规则以使我的代码更具可读性。

可以用C++实现这个吗?
如果可能的话,如何修改代码中的类方法?


成员函数通过其左侧参数(即 this 指针)进行匹配。由于本机类型不能具有成员函数,因此您必须通过非成员函数(对于您没有写入访问权限的其他类型)添加用户定义类型的右乘。

template<typename T>
Matrix<T> operator*(T const& scalar, Matrix<T> rhs)
{
    // scalar multiplication is commutative: s M = M s
    return rhs *= scalar; // calls rhs.operator*=(scalar);
}

NOTE: 以上是我写的非会员operator*以会员的方式实施operator*=。建议将所有乘法编写为非成员函数,并使用成员函数operator*=使用 lhs 矩阵元素实现这些乘法。

这将 a) 保持类接口最小化,b) 防止隐藏转换。例如。如果尺寸为 1x1,您可以拥有一个可隐式转换为标量的 Matrix 类,并且如果您不提供直接匹配的单独重载,这些转换可能会默默发生。

template<typename T>
Matrix<T> operator*(Matrix<T> lhs, T const& scalar)
{
    return lhs *= scalar; // calls lhs.operator*=(scalar);
}

template<typename T>
Matrix<T> operator*(Matrix<T> lhs, Matrix<T> const& rhs)
{
    return lhs *= rhs; // calls lhs.operator*=(rhs);
}

请注意 lhs 矩阵是副本而不是引用。这允许编译器进行优化,例如复制省略/移动语义。另请注意,这些运算符的返回类型是Matrix<T>并不是const Matrix<T>这是一些旧 C++ 书籍中推荐的,但它阻止了 C++11 中的移动语义。

// class member 
template<typename T>
Matrix<T>& Matrix<T>::operator*=(Matrix<T> const& rhs)
{
    // your implementation
    return *this;
}

// class member 
template<typename T>
Matrix<T>& Matrix<T>::operator*=(T const& scalar)
{
    // your implementation
    return *this;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将对象与左侧的常量相乘 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • Ruby 模板:如何将变量传递到内联 ERB 中?

    我有一个内联到 Ruby 代码中的 ERB 模板 require erb DATA a gt HELLO b gt WORLD template ERB new lt lt EOF current key is current value
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 为什么要缓存 jQuery 对象?

    那么为什么我们要缓存 jQuery 对象呢 在以下场景中 var foo bar foo attr style cool foo attr width 123 bar attr style cool bar attr width 123 为
  • 使用 Git 创建更改文件的存档

    我正在寻找一个简单的解决方案来存档最近更改的文件 我得到这个简单的命令google git archive o update zip HEAD git diff name only HEAD 当我在 GIT BASH 中运行它时 它一直说致
  • 如何编写 ANSI C 控制台屏幕缓冲区?

    我正在制作一个基于 ASCII 的游戏 到处都有人说要使用 MSDN 中的 Console Write 如果你使用的是 Windows 那就太棒了 但我没有 因此 我尝试用 C 语言编写一个函数或一组函数 可以在两个屏幕缓冲区之间交替 并将
  • NameValuePair 在 API 22 中已弃用

    现在 namevaluepair 在 API 22 中已被弃用 如果我想实现 namevaluepair 接口 我该怎么办 下面是我的代码 package com example passpass import org apache htt
  • Python csv:UnicodeDecodeError

    我正在用Python读取一个文件csv模块 并且还有另一个编码问题 抱歉 这里有太多问题 在 CSV 文件中 有 符号 读入该行并打印后 它们已变为 xa3 尝试将它们编码为 Unicode 会产生UnicodeDecodeError ro
  • h5py,访问SVHN中Datasets中的数据

    我想读书街景门牌号 SVHN 数据集通过使用h5py In 117 def printname name print name In 118 data digitStruct visit printname bbox name 数据中有两组
  • 检测与 Maven 的依赖冲突

    我有一个 Maven 构建的 Java 应用程序 它引入了许多库 该应用程序位于一个 git 存储库中 具有其自己的 Maven 构建 每个库位于其自己的 git 存储库中 具有其自己的 Maven 构建 此外 应用程序和一些库都依赖于 g
  • SQLSTATE[HY000] [1045] 用户“用户名”@“localhost”的访问被拒绝(使用密码:YES)

    在我的 Ubuntu VM 中 我不断收到 SQLSTATE HY000 1045 用户 用户名 localhost 的访问被拒绝 使用密码 YES update 我在 env 文件中像这样配置了我的数据库 DB HOST 45 55 88
  • 没有类定义的反序列化对象实例

    任何人都知道从二进制 java 序列化对象创建 java 对象实例的工具 脚本 程序 任何东西吗 我没有 class 文件 所以我不能 据我所知 简单地创建一个 ObjectInputStream 并从那里加载它 该对象具有默认的序列化机制
  • DataGridView SelectionChanged 事件多次触发

    在我的应用程序中 我使用 DataGridView 来显示列表 当用户在数据网格视图中选择一条记录时 它应该在另一个面板中显示详细信息 对于选择 我被要求使用 DataGridView1 SelectionChanged 事件 DataGr
  • Android:如何从收到的短信中获取电话号码?

    我有一个广播接收器 SMSApp 它的 onReceive 会从意图中读取bundleExtras 在这里 我如何从bundleExtras中读取电话号码 if intent getAction equals SMS RECEIVED Bu
  • 本地报表处理期间发生错误。报表的定义“无效”

    我是使用 SSRS 的新手 我正在使用一个 rdlc文件用于使用 VS 2012 生成 PDF 报告 当我尝试设置如下参数时 ReportParameter param new ReportParameter kvp Key kvp Val
  • Gnuplot PDF 终端在 Mac 上出现字体问题

    出乎意料的是 我的 Gnuplot 开始出现问题pdfcairo终端 生成的 PDF 文件中的字体被卡住 就好像各个字符的宽度被设置为零一样 我在 Mac OS 上使用 Gnuplot 5 2 7 通过自制程序安装 这里是一个最小的不起作用
  • java.lang.ClassNotFoundException:在更新 sdk 后未在路径上找到类: DexPathList

    大家好 我的应用程序一直工作正常 直到昨天 我昨天更新了我的 SDK 它首先开始出现错误 然后出现错误 在值 v24 处找不到资源 像这样的事情我通过更改 build gradle 中的以下行来搜索并解决它 compileSdkVersio
  • iPhone:如何使用平移手势移动状态栏

    就像 Instagram 探索 选项卡一样 当我滚动内容时 状态栏也会移动 总是打电话全屏滚动 like here 当用户滚动tableView时 NavigationBar TabBar同时滚动显示或隐藏 我的问题是 不仅是Navigat
  • SRV 记录的 Java DNS 查找

    在下面的 java 代码中 我进行 DNS SRV 记录查找 以解析给定域名 例如 root 1000000000 blubluzone com 的目标域名和关联端口 用 表示的查找函数HERE 下面以某种方式返回 null 我无法获得查询
  • 为什么我必须在所有响应中传递 RequestContext?

    我想在导航菜单中突出显示当前页面 显然 当您在菜单链接的页面上时 我需要为菜单链接提供一个类似 活动 的类 这是一个经典问题 我见过很多解决方案proposed 我的问题是我讨厌他们所有人 并且认为他们都不是很干 例如 register s
  • 将图像内容从相机加载到文件

    我正在使用phonegap API使用以下指令拍照 或从库中选择 MyApp directive Camera function return restrict A require ngModel link function scope e
  • 为什么具有委派域访问权限的服务帐户仍然需要模拟?

    我正在考虑使用 OAuth 2 0服务帐户 and 域范围内的授权将我们的服务与 Google Apps 集成 一个特定的用例是 当 Google Apps 客户注册我们的服务时 请利用客户现有的组织结构或资源 组织单位 群组 设备 用户
  • 将对象与左侧的常量相乘

    我有一个Matrix类并且它已经超载了 用于标量和矩阵乘法的运算符 template