【发布时间】:2022-01-01 04:26:53
【问题描述】:
我将代码从 Matlab 导入到 Octave,某些函数的速度似乎下降了。 我研究了矢量化,但以我有限的知识无法提出解决方案。 我想问一下,有没有办法加快这个速度?
n = 181;
N = 250;
for i=1:n
for j=1:n
par=0;
for k=1:N;
par=par+log2(1+(10.^(matrix1(j,i,matrix2(j,i))./10)./(matrix3(j,i).*double1+double2)));
end
resultingMatrix(j,i)=2.^((1/N).*par)-1;
end
end
尺寸在哪里:
matrix1 = 181x181x2,
matrix2 = 181x181 --> containing values either 1 or 2 only,
matrix3 = 181x181,
double1, double2 = just doubles
【问题讨论】:
-
您使用包含在
matrix2中的值来索引matrix1,这可能有点棘手,否则这应该相对简单,因为所有涉及的函数都支持矩阵作为输入。制作一个玩具示例(2x2 矩阵左右)并从那里开始。第二个提示:使用更好的变量名。同时拥有小的n和大写的N太模糊了,matrix1和matrix2也是如此。i和j是 also built-in functions 所以你也要避免这些。 -
@Adriaan 事实上,我会特别记住 i 和 j 以备将来使用。幸运的是,这些变量的名称仅用于本文,以保持简单和不混淆。
-
你确定你没有把代码简化太多吗?
k上的循环中的代码不使用k,因此整个循环等效于par = N * log2(...)。但是然后你将par除以N。我不明白这一点。请发布有意义的代码。另外,发布完整代码,给我们一些matrix1和matrix2内容的例子。见minimal reproducible example。 -
这就是编写代码的人编写代码的方式,我只是重命名了变量,因此其功能没有任何变化。不幸的是,我不认为这篇文章可以变得不那么具体,因为它是一个相当特殊的问题。此外,log2(...) 总是根据矩阵选择的 i,j 给出不同的结果,所以我认为我们也不能没有 N *log2。对于这篇文章,您可以考虑除 matrix2 = random 之外的任何值,因为它不会改变其目的。
标签: loops matrix vectorization octave