2017-03-01 4 views
2

私は0と異なる値を取得したいファイルをcsvとし、配列xに保存します。残りの行列要素を配列sに保存したいと思います。これは私がOctaveで実行しているコードです: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値(ファイル内0異なるが20の値)の両方で満たされてしまうことです。 ifの明細書に記載している条件に間違いはありますか?

答えて

3

ゼロと非ゼロが表示されるのは、ループ内に配列を配置する方法です。コードを読み取った場合、CSVファイル内の位置iの値(これは行または列ベクトルであると仮定しています)が0でなければ、ベクトルxの位置iが変更されます。そうでなければ、ベクトルsの位置iが変更されます。ベクトルxを事前に割り当てるわけではないので、ベクトルxは、配列の長さよりも大きな位置を指定して、最終的に値を格納する希望の位置までゼロによって入力されます。

お守り:あなたが見ることができるようにx事前に割り当てないことによって、

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

    0 0 0 3 

>> x(7) = 10 
x = 

    0 0 0 3 0 0 10 

をし、前の最後の要素の間にあるすべての位置、そこに値を配置する最初以外の位置を指定して、ご希望positionにはゼロが設定されます。したがって、0に等しくない値を持つループ内のポイントに到達すると、このゼロ拡張が発生しています。私はあなたのポストについて読んだ何が正しい場合

は、あなたがフィルタアウトにしたい。これは、単純な論理的インデックスで行うことができます0に等しくないCSVファイルの値:

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 
関連する問題