如果 Octave 中的条件未在数组中保存所需的值

If condition in Octave is not saving the required values within an array

我有一个 csv 文件,我只想从中获取不同于 0 的值并将它们保存在数组 x 中。我想将其余矩阵元素存储在数组 s 中。这是我 运行 在 Octave:

中的代码
clear all;close all;clc;

datafile = csvread('data20us.csv');
datafile = datafile(3:length(datafile));

for i=1:length(datafile)
   if (datafile(i) ~= 0)
     % x must stock values different from 0
     x(i) = datafile(i);
   else
     % s must stock the rest of the values
     s(i) = datafile(i);
   end 
end

我遇到的问题是向量 x0 和非 0 值填充(文件中有 20 个值与 0 不同) .我在 if 语句中输入的条件是否有任何错误?

您看到零和非零的原因是您在循环中填充数组的方式。如果您阅读您的代码,如果您的 CSV 文件中位置 i 的值(我假设这是一个行或列向量)不等于 0,则向量的位置 i x 被改变。否则,向量 s 的位置 i 会发生变化。因为您没有预先分配向量 x,所以如果您指定一个大于数组长度的位置,向量 x 会被零填充,直到所需的位置您终于存储了值。

观察:

>> clear x;
>> x(4) = 3
x =

   0   0   0   3

>> x(7) = 10
x =

    0    0    0    3    0    0   10

如您所见,通过不预先分配 x 并且您指定一个位置而不是第一个位置来放置一个值,前一个最后一个元素和您想要的位置之间的所有位置都会填充零。因此,当您到达循环中某个值不等于 0 的点时,您会看到这种零扩展正在发生。

如果我读到的关于您的 post 的内容是正确的,您想要 过滤掉 CSV 文件中不等于 0 的值。这可以通过简单的逻辑索引来完成:

x = datafile(datafile ~= 0);

这将为您提供向量 x,并移除所有零值。最后,您可以创建 s 向量,它只是一个零向量,与向量中零的总数一样长。

s = zeros(1, nnz(datafile == 0));

如果您不知何故对使用循环死心塌地,请考虑 连接 值:

clear all;close all;clc;

datafile = csvread('data20us.csv');
datafile = datafile(3:length(datafile));

% New - Make x empty
x = [];
% New - Make s empty
s = [];

for i=1:length(datafile)
   if (datafile(i) ~= 0)
     % x must stock values different from 0
     % New - concatenate
     x = [x datafile(i)];
   else
     % s must stock the rest of the values
     % New - concatenate
     s = [s datafile(i)];
   end 
end