如何不在运行之间转置向量?

How not to transpose vector between runs?

背景

我偶然发现了八度音程中的一个行为,其中我的一个向量是程序奇数 运行 上的列向量和其他行向量。我需要了解这种极其危险的行为。以下是我的尝试理解。

计划

我的程序bugtest.m如下所示:

IPMatrixCH = csvread("BugChn.csv"); %has 2 rows

IPCH = IPMatrixCH(:,5);

%Defining a longer shifted vector starting with NaN
IPCH_sh(1) = NaN;
IPCH_sh(2:3) = IPCH(1:2);
IPCH_sh = transpose(IPCH_sh)

现在,如果我 运行 这是启动八度后的第一个和第二个命令,我得到:

octave:1> bugtest
IPCH_sh =

      NaN
  -1.1946
  -1.1445

octave:2> bugtest
IPCH_sh =

      NaN  -1.1946  -1.1445

问题

我的理解正确吗

vecname(i) = value

默认设置 ROW 向量的第 i 个分量?我最初的想法是每次调用程序时都会重新定义 IPMatrixCH。那么 IPCH 将始终是一个列向量,但是

IPCH_sh(1) = NaN;
IPCH_sh(2:3) = IPCH(1:2);

将始终填充行向量。或者是IPCH(1:2);毁了这个?

观察到的行为是因为没有重新读取文件,还是因为 Octave 记住了前一个 运行 中 IPCH_sh 的方向?或者完全不同的东西?有没有办法绝对而不是相对于以前设置矢量的方向?我认为

clear

程序最后解决了问题,但我想明白为什么会这样!

输入文件

可能不重要,但为了完整起见:

"6937",710,26,3,-1.194589,-3.644845,-2.504086,-2.176433,-1.138847,-0.3499769,-0.1842375,0.4976374,"CHN","China"
"6938",710,27,12,-1.144478,-3.201522,-2.375686,-2.029686,-1.09237,-0.327337,-0.13236,0.4428251,"CHN","China"

如果您不清除 运行 之间的变量,那么 IPCH_sh 在第一个 运行 之后以及所有后续 运行 之后仍然存在。由于您要转置矢量,因此它每次都会改变方向。

查看此内容的最佳方法可能是删除每行后的分号,以便它显示每个步骤的输出。

第一次 运行 时,通过设置 IPCH_sh(1) = NaN 创建一个新向量。你给它分配两个值,然后转置它。下次你只是替换第一个元素,然后替换第二个和第三个元素,然后再次调换它。 IPCH_sh(1) = NaN 行不会重新创建 IPCH_sh。它只是为第一个元素分配一个新值。

如果您希望每次的结果都相同,您应该确保重新初始化所有获得赋值并可能在 运行 之间持续存在的变量。由于您总是开始将第一个元素设置为 NaN,然后​​再附加两个值,因此您可以只进行第一个赋值 IPCH_sh = NaN.

示例:

>> IPCH = [1 2 3 4 5; 6 7 8 9 10]  #using a dummy IPCH
IPCH =

    1    2    3    4    5
    6    7    8    9   10

>> IPCH_sh(1) = NaN
IPCH_sh = NaN

>> IPCH_sh(2:3) = IPCH(1:2)
IPCH_sh =

   NaN     1     6

>> IPCH_sh = transpose(IPCH_sh)
IPCH_sh =

   NaN
     1
     6

重新运行宁:

>> IPCH_sh(1) = NaN
IPCH_sh =

   NaN
     1
     6

>> IPCH_sh(2:3) = IPCH(1:2)
IPCH_sh =

   NaN
     1
     6

>> IPCH_sh = transpose(IPCH_sh)
IPCH_sh =

   NaN     1     6

如果您重新定义变量而不是仅仅进行第一个元素赋值:

>>  IPCH_sh = NaN
IPCH_sh = NaN
>> IPCH_sh(2:3) = IPCH(1:2)
IPCH_sh =

   NaN     1     6

>> IPCH_sh = transpose(IPCH_sh)
IPCH_sh =

   NaN
     1
     6

又一次:

>>  IPCH_sh = NaN
IPCH_sh = NaN
>> IPCH_sh(2:3) = IPCH(1:2)
IPCH_sh =

   NaN     1     6

>> IPCH_sh = transpose(IPCH_sh)
IPCH_sh =

   NaN
     1
     6