小编use*_*453的帖子

Math :: Complex搞砸了我的数组引用

我试图在这里优化一些代码,并编写了两个不同的简单子程序,它们将从另一个向量中减去一个向量.我将一对向量传递给这些子程序,然后执行减法.第一个子例程使用中间变量来存储结果,而第二个子例程使用' - ='运算符进行内联操作.完整代码位于此问题的底部.

当我使用纯粹的实数时,程序运行正常,没有问题.但是,如果我使用复杂的操作数,那么原始向量(最初传递给子例程的向量)将被修改!为什么这个程序适用于纯实数,但在使用复数时会进行这种数据修改?

注意我的过程:

  1. 生成随机向量(实际或复杂,具体取决于注释掉的代码)
  2. 将主矢量打印到屏幕上
  3. 执行第一个子程序减法(使用子程序中的第三个变量中间)
  4. 无论使用真实矢量还是复杂矢量,再次将主矢量打印到屏幕上以证明它们没有改变
  5. 执行第二个子程序减法(使用内联计算方法)
  6. 再次将主矢量打印到屏幕,显示使用复矢量时@ main_v1已更改,但使用实矢量时不会改变(@ main_v2不受影响)
  7. 打印减法的最终答案,无论是实数还是复数矢量,它们始终是正确的答案

出现这个问题是因为在第二个子程序(速度快得多)的情况下,我不希望@ main_v1向量发生变化.我需要那个矢量来进行进一步的计算,所以我需要它保持不变.

关于如何解决这个问题,或者我做错了什么?我的整个代码都在下面,应该是有用的.我一直在使用下面显示的CLI语法来运行程序.我选择5只是为了让我能够轻松阅读.

c:\> bench.pl 5 REAL

要么

c:\> bench.pl 5 IMAG

#!/usr/local/bin/perl
# when debugging: add -w option above
#

use strict;
use warnings;
use Benchmark qw (:all);
use Math::Complex;
use Math::Trig;
use Time::HiRes qw (gettimeofday);

system('cls');

my $dimension = $ARGV[0];
my $type = $ARGV[1];

if(!$dimension || !$type){
    print "bench.pl <n> <REAL | IMAG>\n";
    print "   <n> indicates the dimension of the vector to generate\n"; …
Run Code Online (Sandbox Code Playgroud)

arrays perl reference complex-numbers

1
推荐指数
1
解决办法
126
查看次数

标签 统计

arrays ×1

complex-numbers ×1

perl ×1

reference ×1