如果 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
我遇到的问题是向量 x
被 0
和非 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
我有一个 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
我遇到的问题是向量 x
被 0
和非 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