【问题标题】:octave matrix for loop performance用于循环性能的倍频程矩阵
【发布时间】:2011-07-08 11:12:27
【问题描述】:

我是 Octave 的新手。我有两个矩阵。我必须将一个矩阵的特定列与另一个进行比较(我的矩阵 A 包含超过 5 个变量,同样矩阵 B 包含相同的变量。)如果矩阵 A 的第一列中的元素等于第二列中的元素矩阵 B 然后我必须使用第二个矩阵 B 的第三列来计算某些值。我通过使用 for 循环使用八度音阶来执行此操作,但它会消耗大量时间来进行单天的计算,我必须这样做一年 。因为矩阵的大小非常大。请提出一些替代方法,以便我可以减少时间和计算量。 先感谢您。

感谢您的快速回复 -hfs 继续同样的问题, 谢谢你,但这只有在两行中的两个元素相等时才有效。例如我的矩阵是这样的,

A=[1 2 3;4 5 6;7 8 9;6 9 1]
B=[1 2 4; 4 2 6; 7 5 8;3 8 4]

这里 A 的第一个元素的第 1 列等于 B 的第一个元素的第 1 列,即使是第二列,因此我可以取 B 的第三个元素,但是第 1 列的第二个元素在 A 和 B 中是相等的,但第 2 列的第二个元素不同,这里它应该搜索该元素并在第三列中打印该元素,并且使用 for 循环执行此操作,由于尺寸较大,该循环非常慢。在我的实际问题中,我给出了循环如下所示:

for k=1:37651
    for j=1:26018
       if (s(k,1:2)==l(j,1:2))
          z=sin((90-s(k,3))*pi/180) , break ,end

      end
  end 

我想要一种比这更快的替代方法。

【问题讨论】:

    标签: performance for-loop matrix octave


    【解决方案1】:

    您应该尽可能使用完整的矩阵或向量。您应该在交互式 shell 中尝试命令并检查中间结果,看看它们是如何组合在一起的。

    A(:,1)
    

    选择矩阵的第一列。您可以比较矩阵/向量,结果又是一个 0/​​1 的矩阵/向量:

    > A(:,1) == B(:,1)
    ans =
    
      1
      1
      0
    

    如果您分配结果,您可以再次使用它来索引到矩阵中:

    I = A(:,1) == B(:,1)
    B(I, 3)
    

    这会选择AB 的第一列相等的行中B 的第三列。

    我希望这能让你开始。

    【讨论】:

    • 谢谢你,但我必须检查两个条件,A 和 B 的 column1 和 column2 应该相等,然后只有我可以取第三列,甚至我的矩阵也被打乱了。
    • @user835107:嗯,你当然可以组合几个条件(同样,在交互式控制台中检查中间结果以查看发生了什么):A(:,1) == B(:,1) & A(:,2) == B(:,2)all(A(:,1:2) == B(:,1:2), 2)。如果您需要做更复杂的事情,您还可以使用find 获取受影响的索引,然后对其进行 for-loop。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多