Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab “性能/低级别”的含义;a(idx)=[]”等;vs";a=a(~idx)";_Matlab_Performance_Low Level - Fatal编程技术网

Matlab “性能/低级别”的含义;a(idx)=[]”等;vs";a=a(~idx)";

Matlab “性能/低级别”的含义;a(idx)=[]”等;vs";a=a(~idx)";,matlab,performance,low-level,Matlab,Performance,Low Level,正如标题所说,我想知道Matlab在这两个选项之间有什么不同之处。为了便于论证,假设矩阵a和idx足够大,可以处理内存问题,并定义: 案例A:A(idx)=[] 案例B:a=a(~idx) 我的直觉是,如果A执行值重新分配,CPU需要处理从原始位置到新排序位置的索引副本,同时跟踪同一矩阵的当前“头”,然后修剪多余的内存 另一方面,案例B将对新分配的内存空间执行索引大容量复制 所以,案例A可能比案例B慢,但内存需求更少。我的假设正确吗?我不知道,写完这篇文章后,我觉得案例B需要先执行案例A。。

正如标题所说,我想知道Matlab在这两个选项之间有什么不同之处。为了便于论证,假设矩阵
a
idx
足够大,可以处理内存问题,并定义:

  • 案例A:
    A(idx)=[]
  • 案例B:
    a=a(~idx)
我的直觉是,如果A执行值重新分配,CPU需要处理从原始位置到新排序位置的索引副本,同时跟踪同一矩阵的当前“头”,然后修剪多余的内存

另一方面,案例B将对新分配的内存空间执行索引大容量复制

所以,案例A可能比案例B慢,但内存需求更少。我的假设正确吗?我不知道,写完这篇文章后,我觉得案例B需要先执行案例A。。。有什么想法吗


提前感谢

这很有趣,所以我决定采取措施:

我正在使用Windows(64位)版本的Matlab R2016a。
CPU:核心i5-3550,3.3GHz。 内存:8GB DDR3 1333(双通道)

结果:

Measure: a(idx) = [];
Elapsed time is 1.647617 seconds.

Measure: a = a(~idx);
Elapsed time is 0.732233 seconds.

Measure: not_idx = ~idx;
Elapsed time is 0.032649 seconds.

Measure: a = a(not_idx);
Elapsed time is 0.686351 seconds.
结论:

  • a=a(~idx)
    的速度大约是
    a(idx)=[]
    的两倍
  • a=a(~idx)
    的总时间等于
    not\u idx=~idx
    加上
    a=a(not\u idx)

    Matlab可能正在单独计算
    ~idx
    ,因此会消耗更多内存。
    仅当物理RAM处于完全消耗状态时,才使用内存消耗表。
    我认为它可以忽略不计(
    ~idx
    内存消耗是暂时的)
  • 两种解决方案均未优化。
    我估计,完全优化的实现(在C中)要快10倍

  • 这很有趣,所以我决定采取措施:

    我正在使用Windows(64位)版本的Matlab R2016a。
    CPU:核心i5-3550,3.3GHz。 内存:8GB DDR3 1333(双通道)

    结果:

    Measure: a(idx) = [];
    Elapsed time is 1.647617 seconds.
    
    Measure: a = a(~idx);
    Elapsed time is 0.732233 seconds.
    
    Measure: not_idx = ~idx;
    Elapsed time is 0.032649 seconds.
    
    Measure: a = a(not_idx);
    Elapsed time is 0.686351 seconds.
    
    结论:

  • a=a(~idx)
    的速度大约是
    a(idx)=[]
    的两倍
  • a=a(~idx)
    的总时间等于
    not\u idx=~idx
    加上
    a=a(not\u idx)

    Matlab可能正在单独计算
    ~idx
    ,因此会消耗更多内存。
    仅当物理RAM处于完全消耗状态时,才使用内存消耗表。
    我认为它可以忽略不计(
    ~idx
    内存消耗是暂时的)
  • 两种解决方案均未优化。
    我估计,完全优化的实现(在C中)要快10倍

  • 答案可能取决于
    a
    idx
    的大小,也可能取决于Matlab版本。为什么不自己选择这两个选项呢?答案可能取决于
    a
    idx
    的大小,也可能取决于Matlab版本。为什么不自己选择这两个呢?