通过减小最大长度的大小,使长度不等的向量长度相等

时间:2013-08-28 18:39:36

标签: matlab vector

我正在从.txt文件中读取5列到5个向量。

有时一些向量是一个比其他向量大的元素,所以我需要检查它们是否都是相同的长度,如果没有,我必须找到哪些是最大的并删除它们的最后一个元素。我想我应该能够在没有循环的情况下做到这一点。我最初考虑将findisequal结合使用,但isequal仅返回逻辑,并且不提供有关哪些向量最大的信息。

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

然后,根据一个元素的长度,我会做,例如

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

如果Seconds和Sensor1VStatic比其他向量长一个元素

1 个答案:

答案 0 :(得分:3)

假设您的矢量位于单元格数组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);
...

有一些聪明的余地,但它不会使事情更具可读性,从长远来看也不会节省时间......