【问题标题】:Write for loop as boolean operation将 for 循环写为布尔运算
【发布时间】:2016-06-17 14:18:01
【问题描述】:

问题陈述

我想通过以下方式提高包含大量 for 循环的代码的速度。我在一次会议上交谈过的一位程序员提到,matlab 中的布尔运算比 for 循环运行得更快(对不起,我不是程序员,所以如果我错了,请告诉我)。

我有多个类似于此的循环:

for k= 1:length(source);
    kk=source(1,k);
    E(find(E(:,2)==kk),3)=0;

end 

我试图通过这个循环实现的目标

通过这个循环,我想在 E 的第二列中找到与源中的值相等的所有值。在我找到第二列中的值的行中,我想将第三列设置为零。

问题 有没有办法把它写成matlab布尔矩阵运算?或者有没有其他方法可以改进编码以提高这类短 for 循环的速度?

【问题讨论】:

    标签: matlab boolean


    【解决方案1】:

    在这种情况下,您基本上希望在第 2 列中找到 source 数组中的所有行,并将它们设置为等于 0。您可以使用ismember 检查一个数组中的项目是否在另一个数组中。当在第二个输入中找到该项目时,它将返回一个与第一个输入大小相同的逻辑数组,即1,否则返回0

    % Figure out which rows of E(:,2) contain a value that exists in source
    tf = ismember(E(:,2), source);
    

    这个逻辑数组 (tf) 告诉我们要将 E 的哪些行设置为 0。我们可以使用这个变量作为第一个下标(行),然后我们想指定列3作为赋值的第二个下标。

    % Set these rows (at column 3) equal to 0
    E(tf, 3) = 0;
    

    旁注

    在上面的解决方案中,我们完全消除了 for 循环。这并不总是可能的。在您的情况下,如果我们无法删除循环,我们至少可以删除 find 以加快速度。这是因为E(:,2) == k 将产生一个逻辑矩阵,我们可以将其直接用作赋值中的第一个下标。不需要find。逻辑索引总是会比 find 更快。

    E(E(:,2) == k, 3) = 0;
    

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多