我正在从.txt文件中读取5列到5个向量。
有时一些向量是一个比其他向量大的元素,所以我需要检查它们是否都是相同的长度,如果没有,我必须找到哪些是最大的并删除它们的最后一个元素。我想我应该能够在没有循环的情况下做到这一点。我最初考虑将find
与isequal
结合使用,但isequal
仅返回逻辑,并且不提供有关哪些向量最大的信息。
[Seconds,Sensor1VStatic,Sensor2VPulsed,TemperatureC,RelativeHumidity] = importfile(path);
然后,根据一个元素的长度,我会做,例如
Seconds(end) = [];
Sensor1VStatic(end) = [];
如果Seconds和Sensor1VStatic比其他向量长一个元素
答案 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);
...
有一些聪明的余地,但它不会使事情更具可读性,从长远来看也不会节省时间......