2

.txt ファイルから 5 つのベクトルに 5 つの列を読み込んでいます。

一部のベクトルは他のベクトルよりも 1 要素大きい場合があるため、それらがすべて同じ長さであるかどうかを確認する必要があります。そうでない場合は、どれが最大かを見つけて最後の要素を削除する必要があります。ループなしでこれを行うことができるはずだと思います。もともと とfind組み合わせて使用​​することを考えていましisequalたがisequal、論理を返すだけで、どのベクトルが最大であるかに関する情報は提供しません。

[Seconds,Sensor1VStatic,Sensor2VPulsed,TemperatureC,RelativeHumidity] = importfile(path);

次に、どのベクトルが 1 要素長くなるかに応じて、たとえば、次のようにします。

Seconds(end) = [];
Sensor1VStatic(end) = [];

Seconds と Sensor1VStatic が他のベクトルよりも 1 要素長い場合

4

1 に答える 1

3

ベクトルが cell 配列にあると仮定しますA

A = {[1 2 3], [1 2 3 4], [1 2 3 4 5]};

各ベクトルのサイズを取得するには、

sz = cellfun(@(x)size(x,2), A);

どちらが返されますか(上記の例の場合)

sz = [ 3 4 5]

これで、最短ベクトルを見つけることができます。

minLength = min(sz);

最後に、すべてのベクトルをこの長さにします。

B = cell2mat(cellfun(@(x)x(1:minLength), A, 'uniformoutput', false))';

cellfunもっとエレガントな方法があるかもしれません (そして、実際に「暗黙のループ」を行っていることに注意してください)

これをあなたの(現在展開されている)例に適用すると、おそらく出力をimportfileセル配列に直接割り当てることができます-または別の行としてそれを行うことができます:

A = {Seconds,Sensor1VStatic,Sensor2VPulsed,TemperatureC,RelativeHumidity};

しかし、それはすべて大変な作業になります。代わりに、次のことができます。

minLength = min(size(Seconds,1), size(Sensor1VStatic,1), size(Sensor2VPulsed,1), ...

Seconds = Seconds(1:minLength);
...

いくらか賢くする余地はありますが、読みやすくはなりませんし、長期的には時間の節約にもなりません...

于 2013-08-28T18:50:55.860 に答える