【问题标题】:Fastest way to copy values between two matrix在两个矩阵之间复制值的最快方法
【发布时间】:2015-02-26 15:15:31
【问题描述】:

我正在寻找一种将矩阵的某些特殊值复制到其他矩阵的最快方法。假设我有矩阵 A 例如

A =[4     1     5     4     4
   -2    -1     1     2     2
    3    -1     1     7     3
    5     3    -1     1    -2
    6     4     4    -1     1]

我的目标是将值为 1 和 -1 的元素复制到矩阵 B。预期的矩阵 B 如

B =[ 0     1     0     0     0
     0    -1     1     0     0
     0    -1     1     0     0
     0     0    -1     1     0
     0     0     0    -1     1]

我执行了两种创建矩阵 B 的方法。但是,如果矩阵 A 的大小变大,我认为我的方法仍然不是最快的方法。我知道论坛有很多matlab专家。你能给我建议另一种方式吗? 这是我的代码

%%First way:
tic;B=((A==1)|(A==-1)).*A;toc
Elapsed time is 0.000026 seconds.
%%Second way:
tic;idx1=find(A==1);idx2=find(A==-1);B=zeros(size(A));B(idx1)=1; B(idx2)=-1;toc;B
Elapsed time is 0.000034 seconds.

【问题讨论】:

  • 您的第一种方法是规范解决方案。在您开始尝试优化它之前,请在与您的应用程序中类似大小的矩阵上尝试此操作,看看您是否真的需要进一步优化它。你只是“认为”它不是最快的方式表明你过早地优化
  • 对于这么快的时间最好使用timeit,但对于这么小的矩阵,即使这样也是有问题的......

标签: matlab matrix


【解决方案1】:

这与@thewaywewalk 相提并论

B=A.*reshape(abs(A(:))==1,size(A));

这就是我测试这些的方式:

A=randi(10,1000,1000)-7;
B1=@() ((A==1)|(A==-1)).*A;
B2=@() (abs(A) == 1).*A;
B3=@() A.*reshape(abs(A(:))==1,size(A));


timeit(B1)
ans =
0.0136

timeit(B2)
ans =
0.0080

timeit(B3)
ans =
0.0079

这些会随着运行而变化,但方法是一致的...... 这是对一系列矩阵大小的相同测试:

【讨论】:

  • 感谢 bla 和 thewaywewalk。我认为你的方式是最快的。
【解决方案2】:

我想到的唯一一件事,可能会更快:

B = (abs(A) == 1).*A;

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多