MATLAB 是否优化 diag(A*B)?

2023-11-23

假设我有两个非常大的矩阵A(M×N)和B(N×M)。我需要的对角线A*B。计算完整的A*B需要 M*M*N 次乘法,而计算它的对角线只需要 M*N 次乘法,因为不需要计算最终位于对角线之外的元素。

MATLAB 是否实现了这一点并进行即时优化diag(A*B)自动地,还是在这种情况下我最好使用 for 循环?


还可以实施diag(A*B) as sum(A.*B',2)。让我们将其与针对此问题建议的所有其他实现/解决方案进行基准测试。

为了进行基准测试,下面列出了作为函数实现的不同方法:

  1. 和乘法-1

    function out = sum_mult_method1(A,B)
    
    out = sum(A.*B',2);
    
  2. 和乘法2

    function out = sum_mult_method2(A,B)
    
    out = sum(A.'.*B).';
    
  3. For循环法

    function out = for_loop_method(A,B)
    
    M = size(A,1);
    out = zeros(M,1);
    for i=1:M
        out(i) = A(i,:) * B(:,i);
    end
    
  4. 完全/直接乘法

    function out = direct_mult_method(A,B)
    
    out = diag(A*B);
    
  5. Bsxfun方法

    function out = bsxfun_method(A,B)
    
    out = sum(bsxfun(@times,A,B.'),2);
    

基准测试代码

num_runs = 1000;
M_arr = [100 200 500 1000];
N = 4;

%// Warm up tic/toc.
tic();
elapsed = toc();
tic();
elapsed = toc();

for k2 = 1:numel(M_arr)
    M = M_arr(k2);

    fprintf('\n')
    disp(strcat('*** Benchmarking sizes are M =',num2str(M),' and N = ',num2str(N)));

    A = randi(9,M,N);
    B = randi(9,N,M);

    disp('1. Sum-multiplication method-1');
    tic
    for k = 1:num_runs
        out1 = sum_mult_method1(A,B);
    end
    toc
    clear out1

    disp('2. Sum-multiplication method-2');
    tic
    for k = 1:num_runs
        out2 = sum_mult_method2(A,B);
    end
    toc
    clear out2

    disp('3. For-loop method');
    tic
    for k = 1:num_runs
        out3 = for_loop_method(A,B);
    end
    toc
    clear out3

    disp('4. Direct-multiplication method');
    tic
    for k = 1:num_runs
        out4 = direct_mult_method(A,B);
    end
    toc
    clear out4

    disp('5. Bsxfun method');
    tic
    for k = 1:num_runs
        out5 = bsxfun_method(A,B);
    end
    toc
    clear out5

end

Results

*** Benchmarking sizes are M =100 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.015242 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.015180 seconds.
3. For-loop method
Elapsed time is 0.192021 seconds.
4. Direct-multiplication method
Elapsed time is 0.065543 seconds.
5. Bsxfun method
Elapsed time is 0.054149 seconds.

*** Benchmarking sizes are M =200 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.009138 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.009428 seconds.
3. For-loop method
Elapsed time is 0.435735 seconds.
4. Direct-multiplication method
Elapsed time is 0.148908 seconds.
5. Bsxfun method
Elapsed time is 0.030946 seconds.

*** Benchmarking sizes are M =500 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.033287 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.026405 seconds.
3. For-loop method
Elapsed time is 0.965260 seconds.
4. Direct-multiplication method
Elapsed time is 2.832855 seconds.
5. Bsxfun method
Elapsed time is 0.034923 seconds.

*** Benchmarking sizes are M =1000 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.026068 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.032850 seconds.
3. For-loop method
Elapsed time is 1.775382 seconds.
4. Direct-multiplication method
Elapsed time is 13.764870 seconds.
5. Bsxfun method
Elapsed time is 0.044931 seconds.

中间结论

好像sum-multiplication方法是最好的方法,但是bsxfun方法似乎是赶上他们M从 100 增加到 1000。

接下来,仅使用以下参数测试了更高的基准尺寸sum-multiplication and bsxfun方法。尺寸为 -

M_arr = [1000 2000 5000 10000 20000 50000];

结果是——

*** Benchmarking sizes are M =1000 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.030390 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.032334 seconds.
5. Bsxfun method
Elapsed time is 0.047377 seconds.

*** Benchmarking sizes are M =2000 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.040111 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.045132 seconds.
5. Bsxfun method
Elapsed time is 0.060762 seconds.

*** Benchmarking sizes are M =5000 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.099986 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.103213 seconds.
5. Bsxfun method
Elapsed time is 0.117650 seconds.

*** Benchmarking sizes are M =10000 and N =4
1. Sum-multiplication method-1
Elapsed time is 0.375604 seconds.
2. Sum-multiplication method-2
Elapsed time is 0.273726 seconds.
5. Bsxfun method
Elapsed time is 0.226791 seconds.

*** Benchmarking sizes are M =20000 and N =4
1. Sum-multiplication method-1
Elapsed time is 1.906839 seconds.
2. Sum-multiplication method-2
Elapsed time is 1.849166 seconds.
5. Bsxfun method
Elapsed time is 1.344905 seconds.

*** Benchmarking sizes are M =50000 and N =4
1. Sum-multiplication method-1
Elapsed time is 5.159177 seconds.
2. Sum-multiplication method-2
Elapsed time is 5.081211 seconds.
5. Bsxfun method
Elapsed time is 3.866018 seconds.

替代基准测试代码(带有“timeit”)

num_runs = 1000;
M_arr = [1000 2000 5000 10000 20000 50000 100000 200000 500000 1000000];
N = 4;

timeall = zeros(5,numel(M_arr));
for k2 = 1:numel(M_arr)
    M = M_arr(k2);

    A = rand(M,N);
    B = rand(N,M);

    f = @() sum_mult_method1(A,B);
    timeall(1,k2) = timeit(f);
    clear f

    f = @() sum_mult_method2(A,B);
    timeall(2,k2) = timeit(f);
    clear f

    f = @() bsxfun_method(A,B);
    timeall(5,k2) = timeit(f);
    clear f

end

figure,
hold on
plot(M_arr,timeall(1,:),'-ro')
plot(M_arr,timeall(2,:),'-ko')
plot(M_arr,timeall(5,:),'-.b')
legend('sum-method1','sum-method2','bsxfun-method')
xlabel('M ->')
ylabel('Time(sec) ->')

Plot

enter image description here

最终结论

它似乎sum-multiplication方法在某个阶段是很好的,大约是M=5000标记,然后bsxfun似乎略占上风。

未来的工作

人们可以研究不同的N并研究此处提到的实现的性能。

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

MATLAB 是否优化 diag(A*B)? 的相关文章

  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 求解超定系统最小二乘的最快方法

    我有一个大小为 m n 的矩阵 A m 阶约为 100K n 阶约为 500 和向量 b 另外 我的矩阵是病态的并且等级不足 现在我想找出 Ax b 的最小二乘解 为此我比较了一些方法 scipy linalg lstsq 时间 剩余 14
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 再现频率矩阵图

    我想在 R 中重新创建一个情节 情节如下 来源 Boring E G 1941 作为动态平衡的统计频率 心理学评论 48 4 279 这略高于我的工资等级 能力 因此在这里询问 无聊的状态 第一次 A 只能出现 从不 0 或 总是 1 在
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • 无法在 Document-Term-Matrix 中看到 `RTextTools::toLower()` 文本的结果

    我尝试创建一个矩阵 为此我想降低文本 为此 我使用此 R 指令 matrix create matrix tweets 1 toLower TRUE language english removeStopwords FALSE remove
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • 沿轴 0 重复 scipy csr 稀疏矩阵

    我想重复 scipy csr 稀疏矩阵的行 但是当我尝试调用 numpy 的重复方法时 它只是将稀疏矩阵视为对象 并且只会将其作为 ndarray 中的对象重复 我浏览了文档 但找不到任何实用程序来重复 scipy csr 稀疏矩阵的行 我
  • 如何从连接矩阵绘制图像?

    我想编写一个脚本来从连接矩阵创建图像 基本上 只要矩阵中有 1 我就希望该区域在图像中被着色 对于例如 我使用 Photoshop 创建了这张图像 但我有一个很大的数据集 所以我必须自动化这个过程 如果有人能指出我正确的方向 那将非常有帮助
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • numpy python 中的“AttributeError:'matrix'对象没有属性'strftime'”错误

    我有一个维度为 72000 1 的矩阵 该矩阵涉及时间戳 我想使用 strftime 如下所示 strftime d m y 为了得到像这样的输出 11 03 02 我有这样一个矩阵 M np matrix timestamps 我使用了
  • MATLAB:将当前文件夹设置为脚本位置

    我在不同的文件夹中有一些脚本和数据 我使用addpath和相对路径经常 我的问题是 只有当我的当前文件夹是我执行的脚本所在的位置时 这才有效 例如 如果我执行添加路径 X 的脚本 A 然后执行位于路径 X 中的脚本 B 则 Matlab 不
  • 在网格中查找具有相同值的相邻单元格。想法如何改进这个功能?

    我是 Python 新手 学习了 1 个多月 我尝试创建 Tic Tac Toe 然而 一旦我完成了它 我决定扩展棋盘 从 3x3 到 9x9 具体取决于客户的输入 并通过在棋盘上的任意位置连接 4 个行 列或对角线来获胜 因此 我需要一个
  • 使用简单矩阵乘法时出错

    我在一次简单的乘法运算中偶然发现了一个错误 这让我感到非常惊讶 我一直以为这里发生了什么 只为矩阵乘法 http www mathworks nl help matlab matlab prog operators html x 2 y z
  • Deploytool for MATLAB R2013b 不起作用,发生了什么变化?

    多年来我一直在使用集成deploytool为我的同事创建易于分发的 exe 文件 我几天前安装了R2013b 但无法使用deploytool不再了 尝试打包时的日志文件给出了以下内容 ant
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到

随机推荐

  • Google Translate Widget - 翻译完成回调

    我在我的一个网站上使用谷歌翻译小部件 并使用以下谷歌提供的代码 div div
  • 在 C# 中使用 SQLCommand 进行批量更新/插入

    我怎样才能实现批量update insert using SQLCommand 我想创造SQLCommand动态文本for的循环MyObject 在 C 中为 10SQLParameter 如果是散装的insert 我需要检查每条记录是否已
  • C++ 基类中受保护字段的问题

    我有一个基类 比如说BassClass 有一些字段 我将它们保护起来 还有一些纯虚函数 然后是派生类 比如说DerivedClass like class DerivedClass public BassClass DerivedClass
  • UITableView 内容大小何时随行插入/删除动画更新

    我很好奇 UITableView 的内容大小在执行插入 删除动画调用后何时更新 我认为它会像大多数 UIView 动画 块一样 即使动画尚未完成 帧大小 内容大小也会立即更新 但似乎并非如此 有任何想法吗 不幸的是 在从 UITableVi
  • 我应该使用 new Type() 还是仅使用 Type() 来调用构造函数

    两种语法是等效的 至少我认为它们是等效的 let o1 new Object or let o2 Object 您更常使用哪种方式 可读性问题怎么办 我觉得省略 新 会更实用一些 所以这是我的偏好 我喜欢您可以像对待任何其他返回类型实例的函
  • Terraform ELB access_log S3访问权限问题

    当我尝试为我的 elb access log 创建 s3 存储桶时 我遇到了 terraform 问题 出现以下错误 Error applying plan 1 error s occurred module elb author dev
  • 编译器能否将隐式声明的虚拟析构函数的实现放在单个单独的翻译单元中?

    以下代码编译并链接Visual Studio 2017 年和 2019 年 permissive 但不与任何一个编译gcc or clang foo h include
  • 在运行实例中切换到 Composer 模式

    如何轻松地将现有项目切换为 Composer 该项目现已从 6 1 更新到 8 7 并且应该在 Composer 中运行 全新的作曲家设置不是问题 对于上一个项目 我创建了一个新主机 通过 Composer 安装了 TYPO3 通过 Com
  • 如何更改屏幕方向,而不在Android上创建新的活动?

    不知道标题是否正确 事情是这样的 我有一个应用程序在手机和平 板电脑上的工作方式不同 在手机上它显示为纵向 在平板电脑上显示为横向 为了实现这一目标 我创建了一个名为 CoreActivity 的类 它由我的所有活动扩展并执行以下操作 pu
  • roslyn 编译器未使用 msbuild 复制到 AspnetCompileMerge 文件夹

    我有一个 NET MVC 项目 我正在尝试使用 Jenkins 进行部署 我一直让 Jenkins 运行 msbuild 然后使用 RoboCopy 复制生成的文件 我想切换为仅使用发布配置文件 发布配置文件在使用 Visual Studi
  • 根据内容调整 RichTextBox 的大小

    此代码根据 RichTextBox 的内容自动调整其大小 我遇到了问题 尤其是表格 t可能会被忽略 我尝试了托管解决方案 现在我正在尝试平台调用 电流输出 DllImport gdi32 dll static extern bool Get
  • 在 VueJS 中配置 Get、Post、Patch 全局标头的最佳方法

    我是 VueJs 的新手 我正在寻找在 VueJS 中为 Get Post Patch 配置全局标头的最佳方法 即使用方便 安全性强 目前我只是把它写在export default 对于每个组件 我知道这非常糟糕 所以我请求你们帮忙 感谢
  • 如何使用LDAP对用户进行密码验证?

    我正在编写一个客户端应用程序 使用OpenLDAP库 用户通过 LDAP 服务器进行身份验证 以下是无法比较用户的 userPassword 的硬编码示例程序 include
  • 页面加载后删除 div 时发生 jQuery 冲突

    我正在尝试从页面中删除一个div 最好完全阻止它加载 但现在我决定在页面加载后将其删除 当我尝试以下代码行时在jsFiddle中 the content正如预期的那样 div 被删除 但是 我也尝试过实施它一个实际的网站 但在这种情况下 c
  • Camera.getPicture 不是 ionic 3 中的函数

    我正在使用相机插件单击离子应用程序中的图片 但出现以下错误 OrdercancelPage html 24 ERROR TypeError Object is not a function at Camera getPicture inde
  • Unity构造函数注入其他参数

    我有一个带有构造函数的类 如下所示 public BatchService IRepository repository ILogger logger string user 在我的 DI 引导程序类中 我有以下内容RegisterType
  • 切换 python 打印的最佳方法是什么?

    我在游戏引擎中运行 Python 2 4 并且希望能够在需要时关闭所有打印 例如 我希望在调试版本中打开打印 然后在发布版本中关闭打印 它还必须尽可能透明 我在引擎的 C 代码中对此的解决方案是printf里面的函数vararg宏 并将其定
  • 从 Google Places API (Swift 3) 获取附近地点的列表

    我知道已经存在类似的威胁 但是exact我正在寻找的主题似乎没有被触及 我是一个编程新手 但是 我成功地运行了一个应用程序 它可以获取您当前的位置 将坐标转换为地址 并能够将您的位置数据存储在 tableView 中 现在我正在寻找一种方法
  • Html 锚标记 onclick() 和 href 同时执行

    如同HTML 锚链接 href 和 onclick 两者 帖子 我的是 a href tmp download mp3 Download link a The update 方法将向服务器发送另一个 HTTP GET 方法来更新已下载的文件
  • MATLAB 是否优化 diag(A*B)?

    假设我有两个非常大的矩阵A M N 和B N M 我需要的对角线A B 计算完整的A B需要 M M N 次乘法 而计算它的对角线只需要 M N 次乘法 因为不需要计算最终位于对角线之外的元素 MATLAB 是否实现了这一点并进行即时优化d